代码之家  ›  专栏  ›  技术社区  ›  thr

在两个客户端之间发送消息,如何验证发件人的身份?

  •  1
  • thr  · 技术社区  · 14 年前

    所以假设有两个客户机,C1和C2,每个客户机都有一个关联的GUID。

    据说 来自C1(通过检查GUID并确保它与C1的GUID匹配),但由于不能保证消息来自C1(C3可能只是发送了消息,在消息头中发送了C1的GUID),因此必须对消息是否实际来自C1进行一些验证。

    我一直在研究使用非对称加密(RSA)让C1发送一个包含 [C1.GUID; RSAEncrypt(C2.PUBLIC_KEY, C1.GUID); MESSAGE]

    message.GUID == RSADecrypt(C2.PRIVATE_KEY, message.ENCRYPTED_GUID)
    

    这是可行的方法吗?或者有其他更聪明/更明显的方法来验证消息的发送者吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Falcon    14 年前

    不对称算法就是为了这样的目的而发明的,这就是数字签名的工作方式。

    但是,你的方法有一些问题。任何拥有接收者公钥的人都可以伪造签名。而且,签名根本不会改变!任何截获消息的人都可以假装是有效的发送者。非对称加密的目的是通过密钥交换来解决这些问题,这就是数字签名的概念,它基本上是一个非对称加密的散列消息,你正在到处乱扔。

    http://en.wikipedia.org/wiki/RSA#Signing_messages

    我会用图书馆的数字签名算法。第一个google搜索出现在Python上:

    http://www.example-code.com/python/pythonrsa.asp

    http://www.chilkatsoft.com/dsa-python.asp

        2
  •  0
  •   Joel Etherton    14 年前

    此方法的问题是,任何计算机都可以捕获guid和rsa加密的guid,并将它们相同地传递给其他计算机。您还没有真正创建任何只有接收客户端才能预测的唯一挑战/响应条件。你需要的是一个完全独特的东西,不能仅仅通过查看传递的参数来获得。可能是这样的:

    [ClientName; RSA-ENCRYPTED(GUID+Timestamp); MESSAGE]
    

    在这种方法中,RSA加密将使用Client2的公钥来完成,这样只有Client2的私钥才能解锁它。使用ClientName,Client2可以从数据源检索预期的GUID,然后将返回的GUID与加密中的GUID匹配。我将时间戳的用法合并为salt,这样每次加密的字符串都会有不同的结果。使用时间戳作为盐的随机化被认为是非常弱的,但是它得到了重点。可以实现其他更安全/随机的算法。

        3
  •  0
  •   Nicolas Repiquet    14 年前

    任何在客户端和服务器之间监视消息的人都可以伪造新消息 GUID RSA-ENCRYPTED-GUID .

    考虑切换到此消息模型: [GUID; ENCRYPTED_CONTENT_CHECKSUM; CONTENT]

    Checksum(message.CONTENT) == 
        RSADescrypt(C1.PUBLIC_KEY, message.ENCRYPTED_CONTENT_CHECKSUM)
    

    不过,任何监视消息的人都可以重新发送以前发送的消息。

        4
  •  0
  •   Bengie    14 年前

    公钥和私钥是解决问题的方法。我假设您不关心加密数据,但您关心的是数据是“授权的”。

    假设你有三台电脑

    比较2 比较3

    Comp1将使用其私钥对邮件进行数字签名

    Comp2将截获从Comp1到Comp3的消息,但不能在不使签名无效的情况下更改消息

    Comp2将消息转发到Comp3

    Comp3将使用Comp1的公钥来解密签名,并使用签名中的哈希来验证内容。

    Comp1将使用其私钥对邮件进行数字签名

    Comp1将生成一个随机加密密钥(通常是AES)并对消息进行加密。

    Comp1将获取该加密密钥并使用Comp3的公钥对其进行加密

    Comp2将截获该消息,但如果没有Comp3的私钥,则无法读取该消息

    Comp3将使用它的私钥来解密AES密钥

    Comp3将使用AES密钥解密整个消息

    Comp3将通过使用Comp1的公钥解密签名来验证消息。

    签名包含消息的哈希,如果哈希和消息的哈希匹配,则数据是完整的。

    您可以将guid包含在有效负载中,作为一个查找来决定使用哪个公钥。