0
点赞
收藏
分享

微信扫一扫

Python hashlib模块中的sha加密

柠檬果然酸 2022-09-15 阅读 183


Python hashlib模块中的sha加密

一、sha简介

sha (Secure Hash Algorithm)模块与md5的作用相似,用于对信息进行加密。 "Secure Hash Algorithm", 是“安全散列算法”的意思。

sha1 对一段信息进行比较复杂的算法计算,生成一个160位的哈希值密文。sha1 的生成过程比 md5 的生成过程更复杂,这里就不说生成原理了,感兴趣可以查阅相关内容。

sha 是一个家族,是从最初的 sha0 演进而来的,现在使用的有 sha1,  sha2, sha3。 sha2 和 sha3 又分好几种,如 sha2 有sha224, sha256, sha384, sha512。不同的分类生成的结果长度不同,一般来说,用得比较多的是sha256。

sha 碰撞的可能性非常低。同时,sha 的计算过程是不可逆的,所以 sha 可以被当作唯一值使用,类似于“指纹”。

在Python2中,有一个模块就叫 sha,现在也还可以使用,不过我们导入sha模块时,模块名上有一个中划线,说明现在已经不推荐使用 sha 模块了,Python3中已经废弃了。

Python将md5和sha两个模块整理成了一个模块,叫hashlib,兼容Python2和Python3,在Python2和Python3中都可以使用。

二、hashlib生成sha

# coding=utf-8
import hashlib


sh = hashlib.sha1()
sh.update('abcdef'.encode('utf-8'))
print('sha1:\t', sh.hexdigest())

sh = hashlib.sha224()
sh.update('abcdef'.encode('utf-8'))
print('sha224:\t', sh.hexdigest())

sh = hashlib.sha256()
sh.update('abcdef'.encode('utf-8'))
print('sha256:\t', sh.hexdigest())

sh = hashlib.sha384()
sh.update('abcdef'.encode('utf-8'))
print('sha384:\t', sh.hexdigest())

sh = hashlib.sha512()
sh.update('abcdef'.encode('utf-8'))
print('sha512:\t', sh.hexdigest())

sh = hashlib.sha3_224()
sh.update('abcdef'.encode('utf-8'))
print('sha3_224:', sh.hexdigest())

sh = hashlib.sha3_256()
sh.update('abcdef'.encode('utf-8'))
print('sha3_256:', sh.hexdigest())

sh = hashlib.sha3_384()
sh.update('abcdef'.encode('utf-8'))
print('sha3_384:', sh.hexdigest())

sh = hashlib.sha3_512()
sh.update('abcdef'.encode('utf-8'))
print('sha3_512:', sh.hexdigest())

运行结果:

sha1:  1f8ac10f23c5b5bc1167bda84b833e5c057a77d2
sha224: 7043631cb415556a275a4ebecb802c74ee9f6153908e1792a90b6a98
sha256: bef57ec7f53a6d40beb640a780a639c83bc29ac8a9816f1fc6c5c6dcd93c4721
sha384: c6a4c65b227e7387b9c3e839d44869c4cfca3ef583dea64117859b808c1e3d8ae689e1e314eeef52a6ffe22681aa11f5
sha512: e32ef19623e8ed9d267f657a81944b3d07adbb768518068e88435745564e8d4150a0a703be2a7d88b61e3d390c2bb97e2d4c311fdc69d6b1267f05f59aa920e7
sha3_224: ceb3f4cd85af081120bf69ecf76bf61232bd5d810866f0eca3c8907d
sha3_256: 59890c1d183aa279505750422e6384ccb1499c793872d6f31bb3bcaa4bc9f5a5
sha3_384: d77460b0ce6109168480e279a81af32facb689ab96e22623f0122ff3a10ead263db6607f83876a843d3264dc2a863805
sha3_512: 01309a45c57cd7faef9ee6bb95fed29e5e2e0312af12a95fffeee340e5e5948b4652d26ae4b75976a53cc1612141af6e24df36517a61f46a1a05f59cf667046a

在hashlib中,sha1, sha2, sha3 的各个分类使用方法都是一样的,先实例化一个 sha 对象,然后使用 sha 对象的update()方法传入需要加密的信息(需要先编码),然后通过 sha 对象的hexdigest()方法来返回加密后的值。

从上面的结果来看,使用不同hash函数计算出来的hash值的长度是不一样的,说明经过的算法也是不一样的。

不同的长度意味着不同的复杂度,加密的安全程度也不相同,可以根据不同的场景选择不同的分类。当然了,对于平时的开发工作,使用哪个都可以,一般情况最常用的是sha256,如果需要仔细研究使用哪种hash值的时候,那就说明您的项目很重要,就要根据情况选择。

三、不定长度的hash值

import hashlib


sh = hashlib.blake2b()
sh.update('abcdef'.encode('utf-8'))
print(sh.hexdigest())

sh = hashlib.blake2s()
sh.update('abcdef'.encode('utf-8'))
print(sh.hexdigest())

sh = hashlib.shake_128()
sh.update('abcdef'.encode('utf-8'))
print(sh.hexdigest(100))
print(sh.digest(10))

sh = hashlib.shake_256()
sh.update('abcdef'.encode('utf-8'))
print(sh.hexdigest(100))
print(sh.digest(10))

运行结果:

dde410524e3569b303e494aa82a3afb3e426f9df24c1398e9ff87aafbc2f5b7b3c1a4c9400409de3b45d37a00e5eae2a93cc9c4a108b00f05217d41a424d2b8a
267e4443fc1a38879feb1090af1e788956dfd93204cddcba818d6e32ee57f335
9428dbf9493c942630c0618d8a0983d518e828a7c0f4a39c2a54e013f64ebc125475308324e864c2617062639263a24bd58c26379342b40bad4a81e6f3e2c32e41bcd52927971ad0374c88f3244b6d229652a454fdc4fa422838eab19aa2fac7ddf457d6
b'\x94(\xdb\xf9I<\x94&0\xc0'
81d5e45d095acf3c0decf25bcc63f6ee16c689b909b48040ad91c7c67dfe4e9fec910fa73b44e84541600b5a5736b7b0869c89b1e403e35e550158e09bdb7430a6617cff69c0f10fdaf1035ac62ab6277cd267616c06b9ce4d888543ba5771eecf12df03
b'\x81\xd5\xe4]\tZ\xcf<\r\xec'

在hashlib中,除了 sha1, sha256, sha3_256 等算法外,还提供了 blake2b, blake2s,分别是生成最高512位的任意长度哈希和生成最高256位的任意长度哈希。shake_128, shake_256 生成指定字符长度的哈希。

这四种算法的使用方法与 sha1 的使用方法完全相同。

blake2b, blake2s生成的hash值长度是不确定的,也就是说对两条不同的信息进行加密,得到的hash值的长度不一定相同,不像 sha1 等,长度是固定的。但这个长度不能由人控制,而是算法随机。

shake_128, shake_256 生成的hash值是由程序员自己指定的,也就是说,我们可以根据自己的需要来指定最终的长度。使用方法是在 shake 对象的hexdigest()方法或digest()方法中传入一个整数,这个整数是hash结果的长度。

四、hexdigest与digest的转换

import hashlib
import binascii


sh = hashlib.shake_256()
sh.update('abcdef'.encode('utf-8'))
print(sh.hexdigest(10))
print(sh.digest(10))
print("-" * 50)
print(binascii.hexlify(sh.digest(10)).decode('utf-8'))
print(binascii.unhexlify(sh.hexdigest(10)))

运行结果:

81d5e45d095acf3c0dec
b'\x81\xd5\xe4]\tZ\xcf<\r\xec'
--------------------------------------------------
81d5e45d095acf3c0dec
b'\x81\xd5\xe4]\tZ\xcf<\r\xec'

实现hexdigest与digest的转换,需要使用binascii模块的hexlify()和unhexlify()这两个方法。hexlify()将二进制结果转换成十六进制结果,unhexlify()反之。

 

Python hashlib模块中的sha加密_sha加密

 

举报

相关推荐

0 条评论