IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]12.1 hashlib--安全的哈希计算和签名库

    caimouse发表于 2016-06-05 14:54:00
    love 0

    12. 密码相关的库

    本库主要提供了对加密相关的功能,主要有两个模块:hashlib和hmac。

    12.1 hashlib--安全的哈希计算和签名库

    本模块主要提供了安全的HASH计算和数字签名的算法,比如 SHA1、SHA224、SHA256、SHA512,其实哈希算法有时也叫做签名算法,其实两者是相通的。要想使用本模块里的HASH功能,需要使用相应的构造函数,把对象创建出来,再调用相应的函数,比如使用SHA1算法,就需要先调用构造函数sha1()来创建一个对象,接着调用对象的update()函数,在这个函数里输入要计算的bytes对象,最后通过digest()或hexdigest()函数就可以获取相应的HASH值或摘要。

     

    本模块提供了下面的构造函数:md5()、sha1()、sha224()、sha256()、sha384()、sha512(),要想使用其中任何一个算法,都分别调用对应的构造函数就可以创建对象。

     

    hashlib.new(name[, data])

    通过指定算法名称来创建HASH算法对象,也支持创建OpenSSL里提供的算法对象。

    例子:

    #python 3.4

    import hashlib

     

    h = hashlib.new('ripemd160')

    h.update(b'http://blog.csdn.net/caimouse')

    print(h.hexdigest())

    结果输出如下:

    a51579611738a51d4f7c0f5272ea57e17a95ed4e

     

    hashlib.algorithms_guaranteed

    返回在所有平台支持的HASH算法名称的列表。

     

    hashlib.algorithms_available

    返回在Python解释器可以使用的HASH算法名称的列表。

     

    hash.digest_size

    返回HASH结果的大小,单位是字节。

     

    hash.block_size

    返回hash算法内部使用块的大小,单位是字节。

     

    hash.name

    返回hash算法的名称。

     

    hash.update(arg)

    根据输入参数arg进行hash值的更新,参数arg是一个bytes对象。连续多次调用本函数,可以对很长的内容进行计算,比如一个10G大小的文件,可以分成每次计算10M的大小的内容,计算N次的方式。

     

    hash.digest()

    返回一个bytes表示的摘要结果,就是多次调用HASH算法计算之后的结果。

     

    hash.hexdigest()

    本函数跟函数digest()返回的结果一样,只不过本函数是格式化为十六进制字符串的方式返回。

     

    hash.copy()

    返回一个hash的对象拷贝,可以加速公共部分的计算,比如前面10M内容相同,就可以只使用一个对象计算前面10M内容,然后再拷贝多个对象出来计算后面不相同内容部分。

     

    hashlib.pbkdf2_hmac(name, password, salt, rounds, dklen=None)

    本函数提供了PKCS#5的密码加密计算方法。由于密码一般比较短,如果采用普通的sha1算法直接来计算会很容易受到攻击者破解,因此采用多轮计算方法,以及添加一些固定内容来计算。

    参数name是选择HASH算法的名称;参数password是需要计算的密码串,bytes类型;参数salt是用来迭代的字符串,大概长度为16字节左右,bytes类型;参数rounds是进行多少hash计算;参数dklen是返回计算之后键的长度。

    例子:

    #python 3.4

    import hashlib, binascii

     

    dk = hashlib.pbkdf2_hmac('sha256', b'blog.csdn.net', b'caimouse', 100000)

    print(binascii.hexlify(dk))

    结果输出如下:

    b'5f8d95527a486e2ac3635c4d52a1ff3e9d821245b21adf6e9eecc9aa6de1e9a6'

     

    使用hash的例子:

    #python 3.4

    import hashlib

     

    md5 = hashlib.md5()

    md5.update(b'http://blog.csdn.net/caimouse')

    print(md5.hexdigest())

    结果输出如下:

    3a602b3b31be1b78da801b1d3ec85a5b



    蔡军生  QQ:9073204  深圳



沪ICP备19023445号-2号
友情链接