Hom's Blog


Python:hashlib库

hashlib库支持把字符串等进行hash加密处理, 加密后生成的字符串可以用于验证输入是否相等,但又不能直接翻译出原本的内容, 从而实现安全保全和验证. 在检查数字签名时也经常用到hash处理.
secure hash和message digest 是一个概念, 现在更流行前者的用法.

  • sha的全称是secure-hash algorithm, 有各种不同的算法.
  • md5的全称是message-digest algorithm 5(信息-摘要算法), 在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被“压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。

hashlib库

import hashlib 即可

  • 算法名([context]) : 构造出一个对应算法的hash对象. 可以指定内容context. 例如 md5(), sha1(), sha224(), sha256(), sha384()sha512().
  • new(‘算法名’) : 和上类似, 使用算法名去构造, 可以构造出非内建的算法hash对象. 一般使用上述方法构建hash对象更好.
  • pbkdf2_hmac(name, password, salt, rounds, dklen=None)
  • algorithm : 返回保证这个模块可以支持的算法的tuple
  • algorithms_guaranteed : 返回保证这个模块可以在所有平台都支持的算法的set

‘md5’, ‘sha1’, ‘sha224’, ‘sha256’, ‘sha384’, ‘sha512’

  • algorithm_available : 返回当前环境支持的算法名.可能有重复.

‘DSA’, ‘DSA-SHA’, ‘MD4’, ‘MD5’, ‘MDC2’, ‘RIPEMD160’, ‘SHA’, ‘SHA1’, ‘SHA224’, ‘SHA256’, ‘SHA384’, ‘SHA512’, ‘dsaEncryption’, ‘dsaWithSHA’, ‘ecdsa-with-SHA1’, ‘md4’, ‘md5’, ‘mdc2’, ‘ripemd160’, ‘sha’, ‘sha1’, ‘sha224’, ‘sha256’, ‘sha384’, ‘sha512’, ‘whirlpool’

  • pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) : Password based key derivation function 2 (PKCS #5 v2.0) with HMAC as pseudorandom function. 第一个参数是hash方法名, 后面是密码, salt可能用于派生键过程随机化相关,要求大于16byte. iterations,建议大于10000. dklen是派生键的长度, 不给定时使用算法对应digest size. 一个用于给密码加密的方法. 总之password和salt都会影响产生的结果.
>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

hash对象

通过md5()或者new(‘md5’)等方法构造出来的hash对象.

  • name : 使用的算法名, 例如md5
  • digest_size : hash出来字符串的字节数.
  • block_size : hash算法使用的block的大小
  • update(str) : 更新hash对象的内容, 多次用update实际等于将字符串进行串联.
  • digest() : 将现有的内容hash化成字符串, 字符串大小等于digest_size, 可能含有很多非ascii的字符
  • hexdigest() : double长度的字符串,只含有16进制字符. 最常用的方法
  • copy() : 克隆当前的hash对象并返回新hash对象. 好处是可以对相同的头使用同一个hash对象,分支再在其基础上update.
>>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'

和base64的不同, base64可以加密和解密, hash法只能加密不能解. 要解只能用暴力破解咯. 但由于可调参数多, 所以其实都不好破.


一个可以在线计算各种HASH值的网站.

一篇介绍加密编码和破解的博客

Python Library hashlib



◆ 本文地址: http://platinhom.github.io/2015/12/28/py-hashlib/, 转载请注明 ◆

前一篇: Endnote:Journal的XML条目
后一篇: Python:DOI的一个类


Contact: Hom / 已阅读()
Source 类别: Coding  标签: Python