我正在使用AES和一个salt字符串来加密我的“密码”,使用的是我自己制作的java程序。(它使用AES对称加密)
用户设置要加密的消息、盐、迭代和密钥的16个字节。
如果我设置它使用高次数的加密和解密迭代,比如255次,那么我的密码真的会比1次迭代更安全吗?
发布于 2012-07-11 01:07:59
简短的回答是肯定的。
把它想象成一个魔方(这不是最好的例子,但请耐心听我说)。明文是处于已解状态的立方体,密文是处于加扰状态的立方体。每一轮加密都是将立方体的一个面旋转一次。如果立方体的杂乱程度较高,那么在尽可能少的移动次数下求解立方体在计算上就会困难得多。破解一轮AES相当于让人解决一个旋转了一面的魔方。
一种这样的攻击可以有效地解决减少的加密轮数是SAT求解器攻击。
无论如何,您应该使用单向密码操作来存储密码。我认为首选的方法是加密,因为它是加密安全的(单向的)和计算密集型的,因此很难暴力破解。
发布于 2012-07-11 01:08:02
简短的回答是否定的。添加加密迭代无济于事。这与在底层算法中添加轮次不同,在底层算法中添加更多轮次实际上是有帮助的。
更长的答案是,您使用了错误的密码存储技术。你不应该使用对称加密,你应该使用单向散列函数,比如bcrypt。
您的解决方案(对称加密)中的弱点是,加密密钥必须对您的软件可用,才能加密或解密密码。这意味着当攻击者侵入您的系统时,他们将能够获得您的密码数据库和密钥,因此对他们来说,解密所有密码将是微不足道的。您应该假设攻击者能够获取您的源代码以及所有数据。
如果你使用散列函数,那么你不需要担心这种情况。即使攻击者获得了您的源代码和密码数据库,他们仍然无法反转单向散列(假设您使用了良好的散列-同样,请考虑bcrypt),因此窃取您的数据不会损害您用户的密码。
当您考虑安全性时,最好使用现有的解决方案(我提到bcrypt了吗?)而不是滚动你自己的。安全性很难正确处理,即使是专家也搞砸了。不要编写自己的密码存储系统。使用一个由专家设计的,更重要的是,已经被其他专家军团分析和攻击。例如,Bcrypt。
发布于 2012-07-11 01:07:37
是的,更多的轮次将使加密更强大,以抵御某些攻击。但您应该只存储加了盐的、散列的密码。不要加密它们。这样,如果有人窃取了你的数据库,他们就无法解密密码。
https://stackoverflow.com/questions/11418236
复制相似问题