【问题标题】:Client / Server Cryptography for passwords密码的客户端/服务器加密
【发布时间】:2011-08-19 20:45:47
【问题描述】:

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

我遇到的问题不一定是让函数工作,而是了解我需要做什么才能将其与代码相关联。我正在努力理解并阅读过 MSDN(感觉很喜欢),但我仍然只是在学习,所以我的实施确实需要一些清晰准确的指导。

这听起来对吗?

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

然后我

从服务器导出一个公钥并发送给客户端,客户端导入密钥然后加密密码并返回,这样只有服务器才能再次解密。 (尝试时失败)。

或者,我要这样做吗

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

哦,我很迷茫,我什至无法解释清楚。

请帮助我理解这一点...

【问题讨论】:

  • 谢谢大家!仍然有点困惑,但非常坚定地要让它发挥作用。我可以使用已经可用的东西,而且它可能更简单,但是当事情变得艰难或混乱时,我不想一直跳来跳去。我的问题应该更具体一些,因为实际上我的问题与这个加密 API 及其使用有关。我现在已经克服了阻碍我的原始错误,所以我知道我离工作原型不远了。请发布任何好的链接 CryptoAPI、RSA、密码学。我相信我的疯狂总有一天会得到回报!

标签: c++ encryption cryptography client-server public-key


【解决方案1】:

这实际上取决于您想要基于哪种身份验证解决方案。选项多种多样。

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

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

【讨论】:

  • 嗨 gigantt.com,是的 HTTPS 和 SSL 实际上对我来说非常熟悉,因为我有 5 年的网络开发经验。但是当消息到达那里时,它不会是纯文本的 - 并且包含用户名和密码。这让我很担心!我有哪些哈希选项?如果我在客户端上散列一条消息,我可以将其与 D/B 中的内容进行比较,这样明文密码在任何地方都不可用。
  • 只要传输层加密(https),您就不必担心发送纯文本密码。当然,您可以使用 md5 对其进行哈希处理,并且您应该永远将纯文本版本存储在您的数据库中,但是您仍然基本上依赖于 https 的安全性(即使它被哈希处理,也有人可以嗅探散列并使用它..) - 由于这个原因,散列传输密码可能不会增加很多安全性。
【解决方案2】:

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

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

【讨论】:

  • 嗨斯蒂芬,谢谢你的回复,所以一般来说,我会获取 CSP 上下文,创建服务器密钥,然后将公钥发送给客户端,以便应用程序可以加密并发送回(或者是 nave -我确信这就是我学到的)还是更多的参与。我拥有大部分代码,可以在服务器上加密和解密,但不确定将哪些密钥发送给客户端。我可以选择导出会话密钥、交换密钥还是只导出公钥?
  • 我的回答集中在挑战响应部分,我现在看到第二部分有些不清楚,抱歉。服务器的公钥应该已经存储在客户端中,然后您可以使用它在连接期间将随机会话密钥传输到服务器。我知道您可以使用客户端私钥来防止重放攻击等,但我不知道如何使用 TLS 或其他东西:/
  • 谢谢斯蒂芬,很抱歉继续推进这个(我忍不住,因为有些东西告诉我我快到了!)你能解释一下你看到的过程吗,因为我认为那是在哪里我可能会绊倒。我可以在服务器-(S)和客户端(C)上将contxt发送到csp,我可以从(S)导出任何密钥,无论是公共的、私有的、交换的等。问题是当我通过RPC将它发送到无论我使用哪个键(C),客户端都会引发 NTE_BAD_VER 错误。 --> 下一条评论!
  • 我检查了 CSP 并且在客户端和服务器上都是相同的!已经通过网络测试了两台机器,以及同一台机器上的两个应用程序,但仍然是完全相同的错误?正常的过程是什么,为什么要将(C)的会话密钥发送给(S)?那对我来说是新的吗?当我想我想将公钥从 (S) 发送到 (C) 以便 (C) 加密消息并发送回 (S) 时。 (S) 拥有私钥,因此可以解锁 (C) 使用其 (S) 公钥加密的任何内容。我可能遗漏了与加密 api 相关的东西,但我的整个看法是错误的吗?提前致谢!
【解决方案3】:

什么都不做。

这是非常重要的。不要自己实现。
重复不要做任何事情你会弄错的。

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

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

【讨论】:

  • 嗨 Marten,感谢您的回复,但我担心安全问题仍然存在于那种情况下,因为密码在到达服务器时会被解密为明文。这也意味着将明文密码存储在数据库中???你会建议什么形式的端点加密或散列来防止这种情况。我在大学做过 RSA,并且了解算法,但它只是我不了解的特定客户端/服务器设置中的密钥顺序。谢谢!
  • 将密码存储在数据库中作为纯文本的问题与您关于加密传输层的问题无关。实际上,将密码的散列和加盐版本存储在数据库中。不要以任何其他方式记录或存储明文密码。但是,同样,这与 https 无关。
  • 客户端:(Passowrd 纯文本)-> SSL -> 服务器(又是纯文本)-> 哈希(使用盐的一种方式)-> DB。就我个人而言,我不会在客户端上实现散列,因为这会将您锁定在单一的散列技术中(并且很难升级客户端(或开发包含散列版本控制并准备好支持永远旧版本的方案))。跨度>
猜你喜欢
  • 2012-01-11
  • 2021-11-17
  • 2015-10-29
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多