客户端/服务器密码加密

Client / Server Cryptography for passwords

本文关键字:加密 密码 服务器 客户端      更新时间:2023-10-16

我正在构建一个客户端/服务器应用程序在c++和需要每个客户端提供一个密码。显然,我希望这个在传输过程中是安全的,所以我一直在寻找一种加密密码的方法;因此,只有服务器应用程序才能再次解密它。

我遇到的问题不一定是让函数工作,而是理解我需要做什么,以便将其关联到代码中。我正在努力理解并阅读MSDN(感觉就像它),但我仍然只是在学习,所以我真的需要一些明确和准确的指导我的实施。

这听起来对吗?

  1. 我在服务器和客户端上获得CSP的上下文。
  2. 我在服务器上生成一个密钥,或者加载一个(无论什么)。

然后I

从服务器导出公钥并将其发送给客户端,客户端导入密钥,然后加密密码并返回,以便只有服务器才能再次解密它。(当我尝试失败时)。

还是

导出会话密钥,或使用交换密钥对加密的交换密钥对(单个公共)?

哦,我很失落,我甚至无法解释清楚。

这实际上取决于您希望基于哪种身份验证解决方案。选项是多种多样的

例如,您可以依赖底层OS身份验证。你根本不需要管理密码。但这需要与应用程序运行所在的域进行更紧密的集成。

另一个选择是使用HTTPS和简单的身份验证。它基本上使用SSL加密通信,然后发送用户名/密码对。非常简单,所有web服务器都支持。如果你不想依赖现有的web服务器,如正在安装的IIS,你可以很容易地找到c++代码来为你解决这个问题(搜索StackOverflow)。

如果您不需要加密通信进行其他事情,如数据传输,您可以使用Challenge-Response进行密码验证。密码不需要通过网络传输,也没有第三方重发一些数据包的重放攻击风险。缺点是,中间人(MITM)攻击是可能的。

如果您需要对MITM进行保护或需要对其他通信进行加密通道,则应该使用带有证书的TLS或带有两个对的公钥加密。

什么都不要做

这很重要。不要自己实现它。
重复一遍,不要做任何会出错的事。

你应该使用已经可用的。只要打开一个连接到SSL套接字,流的内容就会在另一端自动加密和解密。

您的应用程序应该简单地接受用户名/密码元组并验证它们是否正确。不要尝试实现加密部分