hashlib模块

hashlib模块

前言

python的hashlib提供了常见的摘要算法,如MD5、SHAI等。
摘要算法又称哈希算法、散列算法。它通过一个函数,吧任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。


摘要算法是通过摘要函数f()对任意长度的数据计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单项函数,计算(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算的摘要完全不同。

一、使用示例:


    import hashlib

    md5 = hashlib.md5()
    md5.update('how to use md5 in python hashlib?')
    print(md5.hexdigest()) 

    计算结果如下:
    d26a53750bc40b38b65a520292f69306

     如果数据量很大(计算大文件是否被篡改),可以分块多次调用update(),最后计算的结果是一样的。

    md5 = hashlib.md5()
    md5.update('how to use md5 in ')
    md5.update('python hashlib?')
    print md5.hexdigest()


    MD5是最常见的摘要算法,速度很快,生成结果是固定的128bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似。

    import hashlib
    sha1 = hashlib.sha1()
    sha1.update('how to use sha1 in ')
    sha1.update('python hashlib?')
    print sha1.hexdigest() 
SHA1的结果是160bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。 二、摘要算法应用 任何允许用户登录的网站都会存储用户登录的用户名和口令,如何存储用户名和口令呢?方法是存到数据库表中,如果以明文保存如果数据库泄漏,所有的用户的口令就落入黑客的手里。正确的保存方式是不存储明文口令,而是存储用户口令的摘要,这样的话还是有一个隐患,就是“撞库”黑客可以事先计算常用口令的MD5值,然后和得到的密码进行比对。 能否在程序设计上对简单口令加强保护呢?hashlib摘要算法支持对数据进行“加盐”: hashlib.md5("salt".encode("utf8")) 经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。
posted @ 2018-05-24 15:23  zhangliang666  阅读(141)  评论(0编辑  收藏  举报