我使用AES和salt String来加密我的'密码',使用我制作的java程序。 (它使用AES对称加密)
用户设置要加密的消息,salt,迭代和密钥的16个字节。
如果我将它设置为使用大量的加密和解密迭代,比如255,那真的会使我的密码比1次迭代更安全吗?
答案 0 :(得分:6)
简短的回答是否定的。添加迭代加密无济于事。这与在基础算法中添加 rounds 不同,其中更多轮次确实有帮助。
答案越长,您使用的是错误的技术来存储密码。您不应该使用对称加密,您应该使用单向散列函数,例如bcrypt。
您的解决方案(对称加密)的弱点是您的软件必须具有加密密钥才能加密或解密密码。这意味着当攻击者闯入您的系统时,他们将能够同时获得您的密码数据库和密钥,因此对他们来说解密所有密码将是微不足道的。您应该假设攻击者能够获取您的源代码以及所有数据。
如果您使用哈希函数,那么您不必担心这种情况。即使攻击者获得了您的源代码和密码数据库,他们仍然无法反转单向哈希(假设您使用好哈希 - 再次考虑bcrypt),因此盗窃您的数据不会影响用户的密码。
当您考虑安全性时,几乎总是最好使用现有的解决方案(我是否提到了bcrypt?)而不是自己动手。安全很难做到,甚至专家也搞砸了。不要编写自己的密码存储系统。使用由专家设计的,更重要的是,已由一大批其他专家进行分析和攻击。比如Bcrypt。
答案 1 :(得分:5)
简短的回答是是。
把它想象成一个魔方(这不是最好的例子,而是和我一起承受)。明文是处于解决状态的立方体,密文是其扰乱状态。每轮加密都会旋转立方体的一个面。如果它更加剧烈地加扰,那么在尽可能短的移动中解决立方体的计算要困难得多。打破一轮AES将是密码相当于要求某人在旋转一个面的情况下解决一个魔方。
一种可以有效解决减少轮次加密的攻击是SAT求解器攻击。
您应该使用单向加密操作来存储密码。我认为首选的方法是bcrypting,因为它在加密方面是安全的(单向)和计算密集型,因此非常难以暴力。
答案 2 :(得分:0)
是的,更多轮次将使加密对某些攻击更强。但是你应该只存储盐渍的哈希密码。不要加密它们。这样,如果有人窃取您的数据库,他们就无法解密密码。