自学内容网 自学内容网

简单了解什么是哈希算法

⚠️: 哈希算法不是加密算法,不能用于加密(因为无法通过哈希反推明文),只能用于防篡改。这是很关键的,不能用于加密是因为hash是一个单向的函数,解密是很困难的即使是开发者自己。

什么是哈希算法呢?哈希算法又称摘要算法、散列算法。Python的hashlib提供了常见的哈希算法,如MD5,SHA1等等。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串。

可见,哈希算法就是通过哈希函数hash(data)对任意长度的数据data计算出固定长度的哈希digest,目的是为了发现原始数据是否被人篡改过。

而哈希算法之所以能指出数据是否被篡改过,就是因为哈希函数是一个单向函数,计算digest=hash(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的哈希完全不同。

哈希算法符合加法结合律:简单说比如对两个字符串加密和直接对一整个字符串加密的结果是一样的。而且加密跟次序无关。

如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:
import hashlib

md5 = hashlib.md5()
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8'))
print(md5.hexdigest())
-------------------------------------------------------
import hashlib

md5 = hashlib.md5()
md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
print(md5.hexdigest())

MD5是最常见的哈希算法,速度很快,生成结果是固定的128 bit/16字节,通常用一个32位的16进制字符串表示;SHA1的结果是160 bit/20字节,通常用一个40位的16进制字符串表示;比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法不仅越慢,而且哈希长度更长。
不同的hash算法只是复杂度不一样。

为了进一步的提高破译的代价,一般在设计的时候还会对简单口令进行保护设计,俗称“加盐”,经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令

import hashlib

def get_md5(data):  # 传参为需要加密的字符串
    obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

val = get_md5('123')

print(val)  # 35093270b6352fa9721370b781f7b4d7

哈希对象的方法:

  1. update(data):更新哈希对象的消息内容

  2. hexdigest(): 获取十六进制表示的哈希值。

  3. digest(): 获取二进制表示的哈希值。

    str1 = "m"
    hash1 = hashlib.md5(str1.encode())
    hash1.digest()
    #输出
    b'o\x8fWqP\x90\xda&2E9\x88\xd9\xa1P\x1b'
    #上述字节流串形式的二进制,当然我们也可以转换为纯二进制的形式也就是0和1元素
    result = hash1.digest()
    binary_string = ''.join(f'{byte:08b}' for byte in result)
    binary_string
    
    128比特表示'01101111100011110101011101110001010100001001000011011010001001100011001001000101001110011000100011011001101000010101000000011011'
    

主要特点:

  • 不可逆 从哈希值不能推导出原始数据
  • 无碰撞(概率低) 不同的信息进行哈希后得到的值应该是不同的, 但是从理论上来说, 哈希算法其实是有可能发生碰撞的, 输入的信息是无穷的, 而输出的哈希值长度是固定的, 所以是有限的。好比要把10个苹果放到9个抽屉里面, 那就会有一个抽屉装了2个苹果, 只不过哈希算法的碰撞的概率是非常小的, 比如128位的哈希值, 就有2的128次方的空间。
  • 效率高 在处理比较大的原生值时, 也能能快速的计算出哈希值
  • 差异大 原始输入信息修改一点信息, 得到的哈希值也是大不相同的
  • 无规律 哈希函数的输出通常是一串看似随机的字母和数字。

其他:

  • 谷歌的以图搜图用到的是 感知哈希(局部敏感哈希)

原文地址:https://blog.csdn.net/qq_43701910/article/details/142879789

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!