在我的应用程序中,我想检查我连接的服务器是否可信。我考虑创建自己的身份检查,而不是使用带有证书成本的SSL,我会在连接时向服务器发送随机字符串。服务器将使用硬编码的私钥对字符串进行加密,然后将结果发回。然后,客户端应用程序将使用硬编码的公钥解密结果(它只有公钥,而不是私钥)。如果它发送的字符串和它解密的字符串匹配,则将证明服务器的标识,并且仅使用AES加密tcp通信(在证明服务器标识之后,AES密钥以rsa加密格式传输)。
问题:
答案 0 :(得分:3)
我想检查我连接的服务器是否可信。
您的方法和使用SSL的方法都无法提供有关服务器可信度的任何信息,但只能提供一种识别服务器的方法,即确保您正在与预期的服务器通信。服务器仍然可能被黑客入侵并提供恶意软件,因此您不应仅仅根据身份识别信任它。
我考虑创建自己的身份检查,我会在连接时向服务器发送一个随机字符串... rsa encrypt ...硬编码私钥...硬编码公钥...
您正在尝试使用证书固定重新创建TLS。证书需要从公共CA购买,这不是TLS的要求。只要客户端预先知道预期的证书或公钥,即在连接之前,您就可以简单地创建自签名证书。使用由公共CA签名而不是自签名的证书的要点是,它不会扩展为将世界上的每个证书安装到客户端浏览器/操作系统中,但它会扩展为具有一些信任锚(根CA)安装。
有关如何将TLS与证书/公钥一起使用固定此page at OWASP的更多信息,其中甚至包括各种语言的代码示例。
答案 1 :(得分:1)
我建议您使用TLS。随着时间的推移,已发现并修复了TLS中的错误。从你自己的设计开始,并假设你不能犯类似的错误是一个很大的风险。
您可以免费创建自己的服务器证书,尤其是在服务器公钥嵌入客户端时,因为您不依赖公共CA来验证服务器的身份。
您还通过使用私钥加密和解密公钥来引入弱点,这不是RSA的设计目的( public 密钥用于加密)。假设这很好,这是另一个很大的风险。