客户端加密 - 最佳实践

时间:2012-09-26 20:55:40

标签: encryption cryptography password-protection

我刚才写了一个“密码锁”C#app作为加密练习。我想将数据移到网上,以便我可以在任何地方访问它而不会影响我的密码数据。我只是想通过社区来运行我的想法,以确保我没有犯错,因为我不是加密专家。

这就是我想象的:

  1. 在C#app中,所有密码数据都使用用户提供的密码加密为单个文本块。我在CBC模式下使用Rijndael(对称加密)。密码使用硬编码值进行加密。
  2. 加密数据将发送到我的数据库
  3. 我转到服务器上的网页并下载加密文本。使用客户端javascript我输入我的密码。 javascript将解密所有内容(仍然是客户端)
  4. 以下是我的假设:

    • 我认为可以拦截所有传输
    • 我认为javascript(包含解密算法和硬编码盐)可以被拦截(因为它实际上只是在网上)
    • 密码无法被拦截(因为它只是输入客户端)
    • 结果是有人窥探可以拥有除密码之外的所有内容。

    所以,根据这些假设:我的数据安全吗?我意识到我的数据只和密码的强度一样安全......我能做些什么来改进它? Rijndael解密速度是否足够慢以防止暴力攻击?

    我考虑使用随机盐值,但仍然需要传输,因此,它似乎不会更安全。我的偏好是不在网络上以任何形式(散列或其他方式)存储密码。

    修改 我正在考虑使用SSL,因此我的“拦截”假设在这种情况下可能无效。

    编辑2: 根据Joachim Isaksson的评论,我将使用SSL运行。请继续打破我的假设!

    编辑3: 根据Nemo的评论,我会在每个用户的基础上使用salt。另外,我正在使用PBKDF2来获取基于密码的密钥,所以这就是我对抗暴力攻击的“慢”所在。

3 个答案:

答案 0 :(得分:2)

如果您没有以任何方式进行加密分析,如果您假设所有信息都可以被拦截(即您在没有SSL的情况下运行),那么您安全。

由于任何人都可以拦截Javascript,他们也可以更改 Javascript,使浏览器在解密后将其中的明文传递给其他地方。

此外,任何侵入网站(或网站所有者)的人都可以恶意更改Javascript以执行相同的操作,即使SSL已启用。

答案 1 :(得分:2)

通过“密码数据”,我假设您的意思是“受密码保护的数据”?

盐确实需要随机。它是晴朗的。盐的目的是防止字典攻击。也就是说,如果有人设法获得您的整个加密数据库,他们可以快速尝试一个大型密码词典来对抗所有用户。使用随机盐,他们需要针对每个用户尝试字典。

或者,或者,即使不破坏数据库,他们也可以为大量字典单词生成大量预加密数据,并立即识别出由任何这些密钥加密的任何已知明文。

即使使用盐,字典攻击也可能比您想要的更快,因此从密码中获取关键数据比大多数人意识到的要复杂得多。

底线:一如既往,永远不要发明自己的密码术,甚至不是你自己的操作模式。要从密码派生加密密钥,请使用驰名的标准,如PBKDF2(又名PKCS#5)。

答案 2 :(得分:1)

嗯,因为这是一个悬而未决的问题:


问题#1

如果提供的密码不正确,或者salt / ciphertext被更改,您打算怎么办?您将获得不正确的解密结果,但您将如何测试?如果仅改变密文的最后部分会发生什么?或者完全删除?

解决方案:提供针对此类攻击的完整性保护。使用其他密钥添加HMAC或使用GCM模式等模式。


问题#2

如果您更改或添加密码的几个字节(比较加密的商店及时)会发生什么?

解决方案:每次使用不同的IV加密密钥库。


已发现4个问题:)密码学很难。