MD5和SHA1的散列函数是没办法逆推的。
假设有个函数 y = f(x),y1 = f(x1) = f(x2),那么破解者只知道y1和函数 f ( ) 的情况下是没办法知道x 是x1还是x2的(MD5就是一种散列函数,而对应一个因变量 y,有多个自变量x的存在),所以是没办法逆推的,你的说法有误;
破解者拿到了加密后的密码 y,然后根据自己的彩虹表找出可能通过MD5(或者其他散列函数)计算以后能够得到y的密码x2,x2不一定是用户本来的密码,这是一对弱碰撞。但不需要知道,破解者就可以登录这个用户的帐号了,因为散列后得到的y是无误的。
以上是MD5/SHA1已经不安全的缘故,不是因为生日、或者规律什么的。
假设有个函数 y = f(x),y1 = f(x1) = f(x2),那么破解者只知道y1和函数 f ( ) 的情况下是没办法知道x 是x1还是x2的(MD5就是一种散列函数,而对应一个因变量 y,有多个自变量x的存在),所以是没办法逆推的,你的说法有误;
破解者拿到了加密后的密码 y,然后根据自己的彩虹表找出可能通过MD5(或者其他散列函数)计算以后能够得到y的密码x2,x2不一定是用户本来的密码,这是一对弱碰撞。但不需要知道,破解者就可以登录这个用户的帐号了,因为散列后得到的y是无误的。
以上是MD5/SHA1已经不安全的缘故,不是因为生日、或者规律什么的。
原来你的密码是「abcdefg」,破解者拿到了「@#$uvwxyz%^&」。计算查表(MD5)得到「hijklmn」也是可以得到该密文的,那这个加密就没用了。
如果你的加盐方式是在密码后面加个「fg」,你的密码是「abcde」,那么跟前述一样,破解者不知道你的算法,试试普通的MD5,查表计算发现「hijklmn」经过MD5以后也是一样的密文,这个时候尝试登录发现失败了,原因是,实际上经过MD5计算的是「hijklmn
fg」。
这给破解者的难题是,服务器加密密码的算法,即你是怎么加盐的。
固定盐的坏处:破解者已经得到你的数据库了,难道还没办法得到你的源代码吗?得到你的源代码以后也就知道你是如何加盐的,哦,原来你是在密码后面加上「fg」,那好,我再改善下我的表,我也跟着你加「fg」,重新生成一份密码表。接下来的工作跟之前一样了。
随机盐的话,即使对方知道算法,也很难搞,因为对应于每一份盐,都得花时间空间去生成对应的密码表,也就是说一个密码表只能破解一个用户的密码,这还是建立在已经得到数据库和加密算法的情况下,成本瞬间高了几个数量级。
这给破解者的难题是,服务器加密密码的算法,即你是怎么加盐的。
固定盐的坏处:破解者已经得到你的数据库了,难道还没办法得到你的源代码吗?得到你的源代码以后也就知道你是如何加盐的,哦,原来你是在密码后面加上「fg」,那好,我再改善下我的表,我也跟着你加「fg」,重新生成一份密码表。接下来的工作跟之前一样了。
随机盐的话,即使对方知道算法,也很难搞,因为对应于每一份盐,都得花时间空间去生成对应的密码表,也就是说一个密码表只能破解一个用户的密码,这还是建立在已经得到数据库和加密算法的情况下,成本瞬间高了几个数量级。
加密的安全方式可以参考另一篇文章 :https://blog.csdn.net/coreyc/article/details/80755517
作者:主公
链接:https://www.zhihu.com/question/20299384/answer/17101887
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。