Hash(哈希)是通过一种算法将任意长度的数据(例如消息、文件等)转换为固定长度的字符串或数字的过程。哈希算法具有以下几个特点:
主要特征:
1.固定长度输出:
无论输入数据的大小或长度如何,哈希值(也称为哈希码、摘要)都将具有固定的长度。例如,SHA-256 哈希算法总是生成 256 位(32 字节)的哈希值。
2.不可逆性:
哈希函数从原始数据生成哈希值,但不能从哈希值反推回原始数据。这意味着哈希过程是单向的。
3.敏感性:
小的输入变化(如更改一个字母)会导致输出哈希值发生巨大改变。这种特性称为“雪崩效应”,如图:
4,抗碰撞性:
在理想状态下,m!=n时,H(m)!=H(n),如果两个不同的输入生成相同的哈希值,这种情况称为“碰撞”。
常用算法:
- MD5(Message-Digest Algorithm 5):广泛使用,但存在安全漏洞,如碰撞攻击。现不再推荐用于安全目的。
- SHA-1(Secure Hash Algorithm 1):较早的哈希算法,现已发现多个安全漏洞。也不推荐用于安全目的。
- SHA-256 和 SHA-3:当前较为安全的哈希算法,广泛用于安全和加密应用。
Hash算法在生活中的实际应用:
- 数据完整性验证:
- 在文件传输中,哈希值可以用来检查数据是否被意外修改,例如文件下载时常看到的验和。
- 密码存储
- 在存储用户密码时,通常会存储密码的哈希值,而不是明文密码,这样可以防止数据泄露时直接暴露用户的密码。
- 数字签名:
- 在数字签名中,通常会先对消息进行哈希处理,并将哈希值与签名一起发送,验证者使用同样的哈希算法对收到的消息进行哈希,并与签名中的哈希值进行比对。
- 区块链:
- 在区块链技术中,哈希算法用于确保数据的完整性和安全性。区块中的信息和前一个区块的哈希值结合在一起,形成不可篡改的链。
- 例如:BTC(比特币)
python有一个Hash算法库——Hashlib
Hashlib是内部库,所以不需要用pip导入
import hashlib
下面是将一串文字转换成的代码
import hashlib
# 输入需要哈希的消息
message = input("请输入您想要哈希的文本:")
# 创建 hashlib 对象,使用 SHA-256 算法
hash_object = hashlib.sha256()
# 更新哈希对象,输入的数据需要是字节类型
hash_object.update(message.encode('utf-8'))
# 获取最终哈希值
hash_value = hash_object.hexdigest() # 以十六进制字符串形式返回哈希值
print(f"SHA-256 哈希值: {hash_value}")
# 使用 MD5
hash_object_md5 = hashlib.md5()
hash_object_md5.update(message.encode('utf-8'))
md5_hash_value = hash_object_md5.hexdigest()
print(f"MD5 哈希值: {md5_hash_value}")
# 使用 SHA-1
hash_object_sha1 = hashlib.sha1()
hash_object_sha1.update(message.encode('utf-8'))
sha1_hash_value = hash_object_sha1.hexdigest()
print(f"SHA-1 哈希值: {sha1_hash_value}")
代码解读
-
导入 hashlib 模块:首先,导入 Python 的
hashlib
模块,它提供了使用多种哈希算法的功能。 -
输入数据:用户可以输入想要进行哈希处理的文本信息。
-
创建哈希对象:使用
hashlib.sha256()
创建一个 SHA-256 哈希对象。您也可以根据需要使用其他算法,例如hashlib.md5()
或hashlib.sha1()
。 -
更新哈希对象:使用
update()
方法将输入数据传递给哈希对象,记得输入的数据必须是字节类型,因此需要使用encode('utf-8')
将字符串转换为字节。 -
获取哈希值:使用
hexdigest()
方法获取计算出的哈希值,并以十六进制字符串形式返回。
密码加密:
一个正常的代码判断密码是否正确:
key=input("请输入密码:")
if key=="123456":
print("登录成功")
else:
print("登录失败")
在代码串里就能看到密码是123456,就算你把它打包成exe,exe文件可以被反编译
用字符Hash值判断密码是否正确:
import hashlib
message=input("请输入密码")
hash_object = hashlib.sha256()
hash_object.update(message.encode('utf-8'))
hash_value = hash_object.hexdigest() # 以十六进制字符串形式返回哈希值
hash_object_md5 = hashlib.md5()
hash_object_md5.update(message.encode('utf-8'))
md5_hash_value = hash_object_md5.hexdigest()
hash_object_sha1 = hashlib.sha1()
hash_object_sha1.update(message.encode('utf-8'))
sha1_hash_value = hash_object_sha1.hexdigest()
if hash_value == "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92" and md5_hash_value=="e10adc3949ba59abbe56e057f20f883e" and sha1_hash_value == "7c4a8d09ca3762af61e59520943dc26494f8941b":
print("登录成功")
else:
print("登录失败")
根据Hashs算法不可逆性与敏感性,可以用多种算法来保证密码不会有碰撞,就变成了最好的保护方式,就算是黑客,破解也难如登天
还有想了解的,发在评论区哦!作者会在24小时回复的(*^▽^*)