我不久前编写了一个“密码储物柜”C# 应用程序作为加密练习。我想将数据移动到网络上,以便我可以在任何地方访问它,而不会泄露我的密码数据。我只是想让社区运行我的想法,以确保我不会犯错误,因为我不是加密专家。
这是我的设想:
- 在 C# 应用程序中,所有密码数据都使用用户提供的密码加密为单个文本 block 。我在 CBC 模式下使用 Rijndael(对称加密)。密码使用硬编码值加盐。
- 加密数据被发送到我的数据库
- 我转到服务器上的网页并下载加密文本。我使用客户端 JavaScript 输入密码。 JavaScript 将解密所有内容(仍然是客户端)
这是我的假设:
- 我假设所有传输都可以被拦截
- 我假设 JavaScript(包含解密算法和硬编码盐)可以被拦截(因为它实际上只在网络上)
- 密码无法被拦截(因为它只是客户端输入)
- 结果是,窥探者可以获得除密码之外的所有内容。
因此,基于这些假设:我的数据安全吗?我意识到我的数据的安全性取决于密码的强度...我可以采取哪些措施来改善这一点? Rijndael 解密速度是否足够慢以防止暴力攻击?
我考虑过使用随机盐值,但这仍然需要传输,因此,它似乎不会更安全。我的偏好是不在网络上以任何形式(散列或其他形式)存储密码。
编辑: 我正在考虑使用 SSL,因此我的“拦截”假设在这种情况下可能无效。
编辑 2: 根据 Joachim Isaksson 的评论,我将使用 SSL 运行。请继续打破我的假设!
编辑3: 根据 Nemo 的评论,我将根据每个用户使用盐。另外,我使用 PBKDF2 根据密码派生 key ,因此这就是我将“缓慢”地抵抗暴力攻击的地方。
最佳答案
即使不以任何方式进行加密分析,如果您假设您的所有信息都可以被拦截(即您在没有 SSL 的情况下运行),那么您就是不安全的。
由于任何人都可以拦截 Javascript,因此他们也可以更改 Javascript,使浏览器在解密后将明文传递到其他地方。
此外,任何入侵网站(或网站所有者)的人都可以恶意更改 Javascript,以执行相同的操作,即使 SSL 已启用。
关于encryption - 客户端加密 - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12610248/