hashlib & hashid¶
hashlib¶
该模块中文名译为“安全散列和消息摘要”,实现了许多不同 Secure Hash 和 message digest 算法的通用接口。包括 FIPS 安全散列算法 SHA1,SHA224,SHA256,SHA384 和 SHA512(在 FIPS 180-2 中定义)以及 RSA 的 MD5 算法(在因特网 RFC 1321 术语“安全散列”和“消息摘要”是可互换的。较旧的算法被称为消息摘要。现代术语是安全哈希。
[!NOTE]
哈希算法是一种将任意大小的数据输入(称为消息)转换为固定大小的输出(称为哈希值或摘要)的算法。哈希值通常是一个短字符串,代表了输入数据的唯一性。常见的哈希算法包括:
- MD5:产生 128 位(16 字节)的哈希值,通常以 32 位十六进制数表示。虽然速度快,但已被证明存在安全漏洞,不建议用于安全敏感的应用。
- SHA-1:产生 160 位(20 字节)的哈希值,已被广泛使用,但也存在安全问题。
- SHA-256:属于 SHA-2 系列,产生 256 位(32 字节)的哈希值,安全性更高,广泛应用于区块链和数字签名等领域。
消息摘要是通过哈希算法生成的固定长度的输出。它是输入数据的“指纹”,具有以下特性:
- 唯一性:不同的输入数据应该产生不同的哈希值(尽管在理论上可能存在哈希碰撞,即不同输入产生相同哈希值,但在实际应用中这种情况非常罕见
) 。- 不可逆性:从哈希值无法推导出原始输入数据。
- 敏感性:输入数据的微小变化会导致哈希值的显著变化。
- 安装:
python 2.7
之后无需安装 - 使用:对于每种类型的 hash,都有一个构造函数方法 . 它们都返回一个具有相同的简单接口的哈希对象。例如:使用
sha1()
创建 SHA1 哈希对象。现在,你可以使用update()
方法以类字节对象填充这个对象(通常为字节) 。在连接数据的任何时候,你都可以使用digest()
或hexdigest()
方法来向它请求摘要。
In [ ]:
Copied!
import hashlib
md5 = hashlib.md5() # 初始化一个md5对象
plaintext = "Darstib{f@k3_h@sh1ng_1s_n0t_s@f3}"
md5.hexdigest() # 'd41d8cd98f00b204e9800998ecf8427e'
md5.update(plaintext.encode()) # 更新md5对象的内容
md5.hexdigest() # '347f7904d41fc08d7747c968a3629596'
import hashlib
md5 = hashlib.md5() # 初始化一个md5对象
plaintext = "Darstib{f@k3_h@sh1ng_1s_n0t_s@f3}"
md5.hexdigest() # 'd41d8cd98f00b204e9800998ecf8427e'
md5.update(plaintext.encode()) # 更新md5对象的内容
md5.hexdigest() # '347f7904d41fc08d7747c968a3629596'
Out[ ]:
'347f7904d41fc08d7747c968a3629596'
In [ ]:
Copied!
# 一步到位
hashlib.md5(plaintext.encode()).hexdigest() # '347f7904d41fc08d7747c968a3629596'
hashlib.sha256(plaintext.encode()).hexdigest() # 'f8aeee485745186e960861bcc35784164c06f13fd300b372e255c9a48dfc3c61'
# 一步到位
hashlib.md5(plaintext.encode()).hexdigest() # '347f7904d41fc08d7747c968a3629596'
hashlib.sha256(plaintext.encode()).hexdigest() # 'f8aeee485745186e960861bcc35784164c06f13fd300b372e255c9a48dfc3c61'
Out[ ]:
'f8aeee485745186e960861bcc35784164c06f13fd300b372e255c9a48dfc3c61'
hashid¶
https://github.com/psypanda/hashID
注意这和 hashids 不是一个东西
- 安装指令:pip install hashids
- 使用场景: 用于识别 hash 算法:给它一个 hash 值,它就能判断出这个值是哪种类型的 hash 值。
使用 ¶
具体在命令行中使用:
$ hashid -h
usage: hashid.py [-h] [-e] [-m] [-j] [-o FILE] [--version] INPUT
Identify the different types of hashes used to encrypt data
positional arguments:
INPUT input to analyze (default: STDIN)
options:
-e, --extended list all possible hash algorithms
including salted passwords
-m, --mode show corresponding Hashcat mode in output
-j, --john show corresponding JohnTheRipper format
in output
-o FILE, --outfile FILE write output to file
-h, --help show this help message and exit
--version show program's version number and exit
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
示例 ¶
$ hashid -e f8aeee485745186e960861bcc35784164c06f13fd300b372e255c9a48dfc3c61
Analyzing 'f8aeee485745186e960861bcc35784164c06f13fd300b372e255c9a48dfc3c61'
[+] Snefru-256
[+] SHA-256
[+] RIPEMD-256
[+] Haval-256
[+] GOST R 34.11-94
[+] GOST CryptoPro S-Box
[+] SHA3-256
[+] Skein-256
[+] Skein-512(256)
[+] Ventrilo
[+] sha256($pass.$salt)
[+] sha256($salt.$pass)
[+] sha256(unicode($pass).$salt)
[+] sha256($salt.unicode($pass))
[+] HMAC-SHA256 (key = $pass)
[+] HMAC-SHA256 (key = $salt)
[+] Cisco Type 7
[+] BigCrypt
In [1]:
Copied!
## massage deal
# username *
def username(username):
l = len(username)
if l <= 2:
return username[0] + "*"
else:
return username[0] + "*" * (l - 2) + username[-1]
def idcard(idcard):
return "*" * 6 + idcard[6:10] + "*" * 8
def phone_num(num):
return num[:3] + "*"*4 + num[7:]
import hashlib
# password md5
def password(psword):
md5 = hashlib.md5() # 初始化一个md5对象
md5.update(psword.encode("utf-8")) # 对字符串进行加密
return md5.hexdigest()
# name sha-1
def name(name):
sha1 = hashlib.sha1()
sha1.update(name.encode("utf-8"))
return sha1.hexdigest()
## massage deal
# username *
def username(username):
l = len(username)
if l <= 2:
return username[0] + "*"
else:
return username[0] + "*" * (l - 2) + username[-1]
def idcard(idcard):
return "*" * 6 + idcard[6:10] + "*" * 8
def phone_num(num):
return num[:3] + "*"*4 + num[7:]
import hashlib
# password md5
def password(psword):
md5 = hashlib.md5() # 初始化一个md5对象
md5.update(psword.encode("utf-8")) # 对字符串进行加密
return md5.hexdigest()
# name sha-1
def name(name):
sha1 = hashlib.sha1()
sha1.update(name.encode("utf-8"))
return sha1.hexdigest()