我使用 AES 和 salt String 来加密我的“密码”,使用我制作的 java 程序。(它使用 AES 对称加密)
用户设置要加密的消息、salt、迭代和 16 个字节的密钥。
如果我将它设置为使用大量的加密和解密迭代,比如 255 次,那真的会让我的密码比 1 次迭代更安全吗?
我使用 AES 和 salt String 来加密我的“密码”,使用我制作的 java 程序。(它使用 AES 对称加密)
用户设置要加密的消息、salt、迭代和 16 个字节的密钥。
如果我将它设置为使用大量的加密和解密迭代,比如 255 次,那真的会让我的密码比 1 次迭代更安全吗?
最简洁的答案是不。添加加密迭代无济于事。这与在底层算法中添加轮次不同,实际上更多轮次确实有帮助。
更长的答案是您使用了错误的技术来存储密码。您不应该使用对称加密,而应该使用单向散列函数,例如 bcrypt。
您的解决方案(对称加密)的弱点是加密密钥必须对您的软件可用,才能加密或解密密码。这意味着当攻击者闯入您的系统时,他们将能够获得您的密码数据库和密钥,因此他们解密所有密码将是微不足道的。您应该假设攻击者将能够获取您的源代码以及您的所有数据。
如果您使用哈希函数,则无需担心这种情况。即使攻击者获得了您的源代码和密码数据库,他们仍然无法反转单向哈希(假设您使用良好的哈希 - 再次考虑 bcrypt),因此窃取您的数据不会危及您用户的密码。
当您考虑安全性时,几乎总是最好使用现有的解决方案(我提到 bcrypt 了吗?)而不是自己动手。安全性很难做到正确,甚至专家也搞砸了。不要编写自己的密码存储系统。使用由专家设计的,更重要的是,已经被一大群其他专家分析和攻击过的。以 Bcrypt 为例。
简短的回答是肯定的。
把它想象成一个魔方(这不是最好的例子,但请耐心等待)。明文是处于已解决状态的立方体,密文是处于加扰状态的立方体。每一轮加密都将立方体的一个面旋转一次。如果它的混乱程度更高,那么在尽可能短的移动次数内求解立方体在计算上要困难得多。破解一轮 AES 相当于要求某人解决一个旋转了一个面的魔方。
一种可以有效解决减少加密轮次的攻击是 SAT 求解器攻击。
无论如何,您应该使用一种加密操作来存储密码。我相信首选的方法是 bcrypting,因为它在密码学上是安全的(一种方式)并且计算量很大,因此很难暴力破解。
是的,更多轮次将使加密对某些攻击更加强大。但是你应该只存储加盐的、散列的密码。不要加密它们。这样,如果有人窃取了您的数据库,他们就无法解密密码。