我刚才写了一个“密码锁”C#app作为加密练习。我想将数据移到网上,以便我可以在任何地方访问它而不会影响我的密码数据。我只是想通过社区来运行我的想法,以确保我没有犯错,因为我不是加密专家。
这就是我想象的:
以下是我的假设:
所以,根据这些假设:我的数据安全吗?我意识到我的数据只和密码的强度一样安全......我能做些什么来改进它? Rijndael解密速度是否足够慢以防止暴力攻击?
我考虑使用随机盐值,但仍然需要传输,因此,它似乎不会更安全。我的偏好是不在网络上以任何形式(散列或其他方式)存储密码。
修改 我正在考虑使用SSL,因此我的“拦截”假设在这种情况下可能无效。
编辑2: 根据Joachim Isaksson的评论,我将使用SSL运行。请继续打破我的假设!
编辑3: 根据Nemo的评论,我会在每个用户的基础上使用salt。另外,我正在使用PBKDF2来获取基于密码的密钥,所以这就是我对抗暴力攻击的“慢”所在。
答案 0 :(得分:2)
如果您没有以任何方式进行加密分析,如果您假设所有信息都可以被拦截(即您在没有SSL的情况下运行),那么您不安全。
由于任何人都可以拦截Javascript,他们也可以更改 Javascript,使浏览器在解密后将其中的明文传递给其他地方。
此外,任何侵入网站(或网站所有者)的人都可以恶意更改Javascript以执行相同的操作,即使SSL已启用。
答案 1 :(得分:2)
通过“密码数据”,我假设您的意思是“受密码保护的数据”?
盐确实需要随机。它是晴朗的。盐的目的是防止字典攻击。也就是说,如果有人设法获得您的整个加密数据库,他们可以快速尝试一个大型密码词典来对抗所有用户。使用随机盐,他们需要针对每个用户尝试字典。
或者,或者,即使不破坏数据库,他们也可以为大量字典单词生成大量预加密数据,并立即识别出由任何这些密钥加密的任何已知明文。即使使用盐,字典攻击也可能比您想要的更快,因此从密码中获取关键数据比大多数人意识到的要复杂得多。
底线:一如既往,永远不要发明自己的密码术,甚至不是你自己的操作模式。要从密码派生加密密钥,请使用驰名的标准,如PBKDF2(又名PKCS#5)。
答案 2 :(得分:1)
嗯,因为这是一个悬而未决的问题:
问题#1
如果提供的密码不正确,或者salt / ciphertext被更改,您打算怎么办?您将获得不正确的解密结果,但您将如何测试?如果仅改变密文的最后部分会发生什么?或者完全删除?
解决方案:提供针对此类攻击的完整性保护。使用其他密钥添加HMAC或使用GCM模式等模式。
问题#2
如果您更改或添加密码的几个字节(比较加密的商店及时)会发生什么?
解决方案:每次使用不同的IV加密密钥库。
已发现4个问题:)密码学很难。