先用md5,再用sha1,这样密码会安全一点吗?
程序员文章站
2022-06-17 12:57:55
...
请教一下,我如果这样转码,是不是安全性会高一点。
比如: sha1(md5("password"))
我想了解的是:
1 是不是有这个必要
2 如果这样可以,对性能影响会不会很大
或者其他有什么是我想不到的,未来可能出现什么问题,等等,希望能得到您的提醒,学习了!
单纯使用MD5之所以不好,并不是说MD5这种方法容易遭到破解,而事实上对于MD5求原象或者第二原象,也就是“逆计算”这种破解,没有什么很好的方法。只能通过预先计算知道许多MD5的对应关系,存在数据库中,然后使用的时候反查,例如我知道'password'的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那么我就用一个数据库存起来,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道这个是口令'password‘使用MD5处理之后的值,原来的口令就是'password'。MD5在身份鉴别系统中用于口令保护已经是很久了事情了,大部分黑客也有针对这种Hash方式准备相应的数据库进行反查,这种数据库称为彩虹表。
所以,为了对抗彩虹表,我们要做的工作是避免预先计算,让攻击者无法(或者非常困难)提前计算好彩虹表。
为了反映为何彩虹表计算是可行的,我们再来算一下。我们假设用户可能输入的口令是键盘上的小写字母和数字,共26+10=36种,之所以这样假设是因为 一个用户比较多的系统中总是会有一些弱口令用户的,我们假设输入的口令至少5个字符,至多12个字符,那么用户可能的输入一共有:
,而12个字节可能的组合应有
种。如果再考虑到用户为了方便记忆,输入的口令是一些已经存在的单词或是词组,可能的输入将会远远少于。用户可能的输入少了,就给了我们枚举的空间。
为了阻止这种枚举,加salt的方法是扩大用户输入的一种简单有效的途径,随机生成一个16字节的随机数,加上用户本身输入的至多12个字符的口令,可能的输入就有种,这么多种可能性,任何一个机构和组织都没有办法存储规模如此庞大的彩虹表。
另外一种方法是通过提升Hash的复杂度,延长攻击者进行暴力破解时所消耗的时间。现在显卡用于并行计算实在太容易,6位纯数字的口令在显卡看来就是秒破。Hash算法的多次迭代就是最简单的延长计算时间的方法,Apache的htpasswd就使用了MD5的1000次迭代,不过只是使得这些口令稍微难破解一些。
另外,题中使用了SHA1和MD5两种算法的方法,除了稍微提升一点计算的难度以外,并没有多好,这种组合方法不能增加用户输入的可能性,另外虽然SHA1生成的是160位的Hash,但是由于输入是一个128位的MD5,所以输出也至多只可能有种可能,猜测的范围也没有缩小。所以这是原来回答我建议你使用更多次数(如1000次)MD5迭代的原因,至少应当有一个方面有稍微大一些的加强。
另外此文(暴力密码破解器 ocl-Hashcat-plus 支持每秒猜测最多 80 亿个密码,意味着什么?)中有数据可以供参考,bcrypt是一种有效对抗口令Hash破解的算法,建议使用。 加盐是为了防止攻击者直接用预先计算好 md5 的字典与密文进行匹配查找明文,因为如果用户密码是字典中的条目,添加随机后缀之后几乎不会出现在字典中,攻击者无从构建彩虹表。
题主的做法,仍然可以被彩虹表攻击。攻击者只要知道你的算法,对先前的单次 md5 构建的彩虹表再做一次 sha 构建新表就好。如果明文本身是表中条目,这样增加的攻击难度非常有限。 当年CSDN暴库的时候就已经写过这个了:
http://blog.sina.com.cn/s/blog_77e8d1350100wfc7.html
前面的回答提到加盐的作用是避免预先计算彩虹表,这个才是正确的解释。不要把加盐和把密码变复杂联系起来,虽然实际上有这么一个副作用,但加盐的原理根本就不是这个。这种误导会导致一些莫名其妙的“加固定盐”的无知想法。
此外什么SHA(MD5(password))或者什么MD5一千遍这种想法通常也是很莫名的,这些问题在我这篇博客里面都回答了,这里就不熬述了。 如果数据泄露了 加 salt 也没有用啊,salt 也被看见了 你可以直接用SHA-2。
但是还是要说一句,像MD5、SHA1这种都是散列算法,而不是加密算法。因为编码后的结果是不可逆的,除非你用穷举。 不要再用 SHA 或者 MD5 了,加了 salt 也不行。请使用 Bcrypt. 首先声明,我不是专业搞密码学的
对于普通的应用,加盐足够了,推荐去看一下 @sumtec 的 没知识真可怕——应用密码学的笑话之MD5+Salt不安全_sumtec_新浪博客 MD5+salt 防止了原有的彩虹表撞库,但是随着计算机性能的提高,算法复杂度不够,那么就可以蛮力撞库破解了
我觉得如果安全要求高的话,需要使用sha256+salt的算法了
这个是一般数据库保存密码的场景
关于这些算法对性能的消耗,我也在找资料。。。原来密码都是md5的没有盐很不安全,在想怎么解决 直接上sha-3 感觉和加固定盐差不多 还是一一对应的关系,加盐可以增加更大的成本;
比如: sha1(md5("password"))
我想了解的是:
1 是不是有这个必要
2 如果这样可以,对性能影响会不会很大
或者其他有什么是我想不到的,未来可能出现什么问题,等等,希望能得到您的提醒,学习了!
回复内容:
看来你不知道什么是salt。生成一个随机数,我们称之为salt,然后在数据库中记录salt和h=hash(pwd + salt),查询的时候,得到用户的口令p,然后从数据库中查出salt,计算hash(p+salt),看是不是等于h,等于就是对的,不等于就是不对的。单纯使用MD5之所以不好,并不是说MD5这种方法容易遭到破解,而事实上对于MD5求原象或者第二原象,也就是“逆计算”这种破解,没有什么很好的方法。只能通过预先计算知道许多MD5的对应关系,存在数据库中,然后使用的时候反查,例如我知道'password'的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那么我就用一个数据库存起来,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道这个是口令'password‘使用MD5处理之后的值,原来的口令就是'password'。MD5在身份鉴别系统中用于口令保护已经是很久了事情了,大部分黑客也有针对这种Hash方式准备相应的数据库进行反查,这种数据库称为彩虹表。
所以,为了对抗彩虹表,我们要做的工作是避免预先计算,让攻击者无法(或者非常困难)提前计算好彩虹表。
为了反映为何彩虹表计算是可行的,我们再来算一下。我们假设用户可能输入的口令是键盘上的小写字母和数字,共26+10=36种,之所以这样假设是因为 一个用户比较多的系统中总是会有一些弱口令用户的,我们假设输入的口令至少5个字符,至多12个字符,那么用户可能的输入一共有:
,而12个字节可能的组合应有
种。如果再考虑到用户为了方便记忆,输入的口令是一些已经存在的单词或是词组,可能的输入将会远远少于。用户可能的输入少了,就给了我们枚举的空间。
为了阻止这种枚举,加salt的方法是扩大用户输入的一种简单有效的途径,随机生成一个16字节的随机数,加上用户本身输入的至多12个字符的口令,可能的输入就有种,这么多种可能性,任何一个机构和组织都没有办法存储规模如此庞大的彩虹表。
另外一种方法是通过提升Hash的复杂度,延长攻击者进行暴力破解时所消耗的时间。现在显卡用于并行计算实在太容易,6位纯数字的口令在显卡看来就是秒破。Hash算法的多次迭代就是最简单的延长计算时间的方法,Apache的htpasswd就使用了MD5的1000次迭代,不过只是使得这些口令稍微难破解一些。
另外,题中使用了SHA1和MD5两种算法的方法,除了稍微提升一点计算的难度以外,并没有多好,这种组合方法不能增加用户输入的可能性,另外虽然SHA1生成的是160位的Hash,但是由于输入是一个128位的MD5,所以输出也至多只可能有种可能,猜测的范围也没有缩小。所以这是原来回答我建议你使用更多次数(如1000次)MD5迭代的原因,至少应当有一个方面有稍微大一些的加强。
另外此文(暴力密码破解器 ocl-Hashcat-plus 支持每秒猜测最多 80 亿个密码,意味着什么?)中有数据可以供参考,bcrypt是一种有效对抗口令Hash破解的算法,建议使用。 加盐是为了防止攻击者直接用预先计算好 md5 的字典与密文进行匹配查找明文,因为如果用户密码是字典中的条目,添加随机后缀之后几乎不会出现在字典中,攻击者无从构建彩虹表。
题主的做法,仍然可以被彩虹表攻击。攻击者只要知道你的算法,对先前的单次 md5 构建的彩虹表再做一次 sha 构建新表就好。如果明文本身是表中条目,这样增加的攻击难度非常有限。 当年CSDN暴库的时候就已经写过这个了:
http://blog.sina.com.cn/s/blog_77e8d1350100wfc7.html
前面的回答提到加盐的作用是避免预先计算彩虹表,这个才是正确的解释。不要把加盐和把密码变复杂联系起来,虽然实际上有这么一个副作用,但加盐的原理根本就不是这个。这种误导会导致一些莫名其妙的“加固定盐”的无知想法。
此外什么SHA(MD5(password))或者什么MD5一千遍这种想法通常也是很莫名的,这些问题在我这篇博客里面都回答了,这里就不熬述了。 如果数据泄露了 加 salt 也没有用啊,salt 也被看见了 你可以直接用SHA-2。
但是还是要说一句,像MD5、SHA1这种都是散列算法,而不是加密算法。因为编码后的结果是不可逆的,除非你用穷举。 不要再用 SHA 或者 MD5 了,加了 salt 也不行。请使用 Bcrypt. 首先声明,我不是专业搞密码学的
对于普通的应用,加盐足够了,推荐去看一下 @sumtec 的 没知识真可怕——应用密码学的笑话之MD5+Salt不安全_sumtec_新浪博客 MD5+salt 防止了原有的彩虹表撞库,但是随着计算机性能的提高,算法复杂度不够,那么就可以蛮力撞库破解了
我觉得如果安全要求高的话,需要使用sha256+salt的算法了
这个是一般数据库保存密码的场景
关于这些算法对性能的消耗,我也在找资料。。。原来密码都是md5的没有盐很不安全,在想怎么解决 直接上sha-3 感觉和加固定盐差不多 还是一一对应的关系,加盐可以增加更大的成本;
下一篇: AB复制(mysql同步)_MySQL