大家好,又见面了,我是你们的朋友全栈君。
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 hashlib提供了常见的摘要算法,具体包括md5、sha1、sha224、sha256、sha512等,我们一般用的比较多是md5。注意加密是单向的。
通过hashlib,可以把任意长度的字符串转换成固定长度的加密串,通常我们一般用hexdigest(),也就是十六进制数据字符串的值来表示。 下面是一段简单的代码示例:
代码语言:javascript复制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))
返回一个十六进制的固定长度字符串,结果如下:
代码语言:javascript复制e2fc714c4727ee9395f324cd2e7f331f
如果用的是digest(),则会返回一个二进制的,结果如下:
代码语言:javascript复制b"xe2xfcqLG'xeex93x95xf3$xcd.x7f3x1f"
如果我们改变str中的任意字符,结果会发生很大的变化。
注意一点:python3中,字符串默认的都是unicode,所以需要先encode到utf8,否则会报错类似于下面这个错误:
代码语言:javascript复制Unicode-objects must be encoded before hashing
由于是单向加密,通常可以用来保存一些内部信息到数据库中,比如用户名密码这一类。因为是单向的,所以不能用于加密解密,只适合于防篡改,或者验证用户密码等。
我们也可以通过把登录名作为Salt的一部分来计算MD5,这样不容易被其他人通过MD5反推明文口令:
代码语言:javascript复制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。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136692.html原文链接:https://javaforall.cn