python安全开发军规之三:使用安全的哈希算法

背景

在开发中,通常有需要进行文件校验、数字签名、协议认证的场景,这些场景中非散列算法莫属,我们常见的有MD系列和SHA系列。 一天,大W提了一个要求,要学习业界主流产品发布方式,要将产品的散列值放在产品下载链接旁边,供用户校验。

普通程序员的写法
In [16]:
import hashlib   
m = hashlib.md5()   
m.update('abc'.encode('utf-8'))
result=m.hexdigest()
print('abc的md5值是:{}'.format(result))
print('md5值的长度是:{}'.format(len(result)))
abc的md5值是:900150983cd24fb0d6963f7d28e17f72
md5值的长度是:32

程序运行良好,达到了需求的预期

QA有话说

MD5是一个问世时间比较长的哈希算法,在2004年以前,都被认为是最安全的哈希算法。直到王晓云教授提出一种MD5碰撞方法之后,就证明两个文件即使内容不同,但是MD5值可相同,这就证明了MD5的不安全性了。到现在随着计算机性能的提升,以及新的攻击方法的出现,还有暴力破解如彩虹表的实现,都使得MD5变得越来越不安全。不能再在商业软件中使用MD5进行文件校验。

高级程序员的写法
In [19]:
sha256 = hashlib.sha256()
sha256.update('abc'.encode(encoding='utf-8'))
print(sha256.hexdigest())
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
小结
  • sha256及sha512目前是较为安全的散列算法,被破解的时间成本非常高
  • 有条件的情况下建议使用hmac算法,它接受一个盐值,在计算过程中导混入盐值,这种方式会更安全,更标准化。下面是一个hmac的示例
In [22]:
import hmac
key=b'secret'
hm = hmac.new(key,'abc'.encode(encoding='utf-8'),digestmod="sha256")
print(hm.hexdigest())
9946dad4e00e913fc8be8e5d3f7e110a4a9e832f83fb09c345285d78638d8a0e