大家好,又见面了,我是你们的朋友全栈君。
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
hashlib提供了常见的摘要算法,具体包括md5、sha1、sha224、sha256、sha512等,我们一般用的比较多是md5。注意加密是单向的。
通过hashlib,可以把任意长度的字符串转换成固定长度的加密串,通常我们一般用hexdigest(),也就是十六进制数据字符串的值来表示。
下面是一段简单的代码示例:
import hashlib
def md5(str):
md5 = hashlib.md5()
md5.update(str)
##return md5.digest() # 返回摘要,作为二进制数据字符串值
return md5.hexdigest() # 返回摘要,作为十六进制数据字符串值
if __name__ == "__main__":
str = "abcdefg"
str = str.encode("utf8") #
print(md5(str))
返回一个十六进制的固定长度字符串,结果如下:
e2fc714c4727ee9395f324cd2e7f331f
如果用的是digest(),则会返回一个二进制的,结果如下:
b"\xe2\xfcqLG'\xee\x93\x95\xf3$\xcd.\x7f3\x1f"
如果我们改变str中的任意字符,结果会发生很大的变化。
注意一点:python3中,字符串默认的都是unicode,所以需要先encode到utf8,否则会报错类似于下面这个错误:
Unicode-objects must be encoded before hashing
由于是单向加密,通常可以用来保存一些内部信息到数据库中,比如用户名密码这一类。因为是单向的,所以不能用于加密解密,只适合于防篡改,或者验证用户密码等。
我们也可以通过把登录名作为Salt的一部分来计算MD5,这样不容易被其他人通过MD5反推明文口令:
def get_md5(user, passwd):
if isinstance(url, str):
url = url.encode("utf8")
m = hashlib.md5()
m.update(user + passwd)
return m.hexdigest()
if __name__ == "__main__":
user = "root"
passwd = "password"
print(get_md5(user, passwd))
注意中间我加了if判断,以便于做unicode的转换。在python3中,已经没有unicode这种类型,str就是unicode。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136692.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...