分享

哈希算法在密码加密存储中的应用

 牛人的尾巴 2019-09-05


互联网公司数据泄露事件已经不是什么新鲜事儿了,目前已经曝光过的数据泄露事件至少上百起,其中不乏一线互联网公司,比较出名的数据泄露事件就有2011CSDN600万用户数据泄露事件和2016年的京东12G用户数据泄露事件,用户数据泄露后最大的危害就是黑客可以通过窃取到的用户名和口令,登录用户账号,侵害用户权益,导致这种结果的直接原因就是受害公司没有对用户的口令信息进行加密处理。如果对用户的口令信息进行加密存储,即使数据被拖库,黑客也无法还原出原始密码。

用户名口令加密存储方法有多种,其中哈希算法加密是一种比较常用的简单方法。

哈希算法又称摘要算法、散列算法,它通过一个函数,把任意长度的数据转换成一个固定的长度的数据串,它是一种单向密码体制,无法从逆向还原出原始明文。

哈希算法有多种,比较常用的有MD5SHA1SHA256等。MD5用一个32位的16进制字符串表示,虽然目前MD5已经被攻破,但是依然很流行;SHA1用一个40位的16进制字符串表示,目前也被攻破,但是相比MD5,被攻破的难度更大一些,SHA256尚未被攻破,比SHA256更加安全,但是越安全的算法越复杂,计算时间越长。

利用哈希算法对用户口令加密存储最简单的办法就是一次哈希加密,python算法如图1所示:

 

1:一次加密哈希算法

即把用户口令简单地进行哈希计算后进行存储,这样得到加密后的密码无法还原到原始口令,相对安全,但是可以通过彩虹表查表破译。彩虹表就是黑客预先计算一些常用口令的md5值,得到一个反推表,如表1所示:

 

1:彩虹表示例

这样,无需破解,只需要对比数据库中的MD5,黑客就能获得部分弱口令的用户账号信息。

如此一来,如何确保那些弱口令用户的账号安全呢?可以在一次哈希加密的基础上进行加盐处理,所谓加盐就是指在用户原始口令后面加一个复杂盐值,即一个复杂的固定字符串,python算法如图2所示:

 

2:加密哈希加盐算法

这样即使用户的弱口令,也很难通过彩虹表反推出明文口令,前提是这个不被泄露,因为无法保证的绝对安全,所以这种加密方法也只是相对安全,不是万无一失的。

该加密方法的硬伤是盐值是固定的,如果是随机的,那么数据的安全性就能更高一些。

PBKDF2(Password-Based Key Derivation Function)算法原理大致相当于在哈希加密基础上加随机盐,然后重复进行运算,并最终产生密钥。如果重复的次数足够大,那么破解的成本就会变得很高,而盐值的添加也会增加彩虹表的攻击难度。PBKDF2函数的定义如图3所示:

 

3:PBKDF2函数的定义

PBKDF2的算法流程

DK的值由一个以上的block拼接而成,block的数量是dklen/hlen的值。就是说如果PRF输出的结果比期望得到的密钥长度要短,则要通过拼接多个结果以满足密钥的长度。

DK = T1 || T2 || ... || Tdklen/hlen

而每个block则通过函数F得到:Ti = F(Password, Salt, c, i)

在函数F里,PRF会进行c次的运算,然后把得到的结果进行异或运算,得到最终的值。

F(Password, Salt, c, i) = U1 ^ U2 ^ ... ^ Uc

第一次,PRF会使用Password作为keySalt拼接上编码成大字节序的32位整型的i作为盐值进行运算。

U1 = PRF(Password, Salt || INT_32_BE(i))

而后续的c-1次则会使用上次得到的结果作为盐值。

U2 = PRF(Password, U1)

...

Uc = PRF(Password, Uc-1)

函数F的大致流程如图4所示

 

4:函数F流程图

使用PBKDF2算法时,HASH算法一般选用sha1或者sha256,随机盐的长度一般不能少于8字节,HASH次数至少也要1000次,这样安全性才足够高。一次密码验证过程进行1000HASH运算,对服务器来说可能只需要1ms,但对于破解者来说计算成本增加了1000倍,而至少8字节随机盐,更是把建表难度提升了N个数量级,使得大批量的破解密码几乎不可行,该算法也是美国国家标准与技术研究院推荐使用的算法。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多