第六章 常用模块(7):python常用模块(加密算法介绍,hashlib模块 (加密模块))

6.3.9 加密算法介绍

  1. HASH
    Hash,一般翻译成‘散列’或‘哈希’。就是把任意长度的输入(又叫做预映射,pre-image),通过哈希算法,转换成固定长度的输出,该输出就是哈希值。 这种转换时一种压缩映射,也就是哈希值的空间通常远小于输入空间,不同的输入可能会哈西城相同的输出,而不可能从哈希值来反推出输入值。 简单说就是一种将任意长度的消息压缩到某一固定长度消息摘要的函数。
    • 特点:
      • 输入任意长度的信息,转换成固定长度的输出
      • 不同的输入可能会得到相同的结果
      • 从结果无法推断到输入
      • 仅在当前程序中保持不变
  2. MD5
    MD5讯息摘要演算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位的散列值(哈希值),用于确保信息传输的完整和一致。 MD5的前身有MD2,MD3和MD4。

    • MD5功能:
      • 输入任意长度的信息,经过处理,输出为128位(bit)的信息(数字指纹)
      • 不同的输入得到不同的结果(唯一性)(其实有可能重复,但是几率远小于hash)
      • 任何平台,任何语言对同样内容生成的MD5值永远不变 (可以用于数字签名:确认文件的一致性)
    • MD5算法的特点:
      • 压缩性:任意长度的数据,算出的MD5值都是128bit
      • 容易计算:无论原数据多大,生成MD5都很快
      • 抗修改性:对原数据的任何改动都会是MD5发生变化
      • 强抗碰撞:一致原数据和MD5,想找到一个具有相同MD5值得原数据(即伪造数据)是非常困难的

        哈希碰撞:不同原数据产生相同的哈希值

MD5算法是否可逆? MD5不可逆,因为用的是hash算法(不可逆的运算)

+ MD5的用途:
    + 防篡改
    + 防看到明文(保存在服务器上的账号密码其实都是MD5值)
        > 但是因为相同的原数据生成的MD5也不会变,也可以用撞库方式来推出结果。。。
    + 防止抵赖(数字签名)
        > 这需要一个第三方认证机构。证明这个文件是本人写过的(比如电子欠条什么的)。

6.3.10 hashlib模块 (加密模块)

1. 文件校验常用算法:MD5

由于SHA的加密安全性更好,一般我们不用MD5进行加密,而是用来做文件校验(是不是同一个文件)

MD5算法的应用:

import hashlib

str1 = 'hello world'
str2 = '欢迎'
m1 = hashlib.md5()  # 初始化一个MD5的对象
m1.update(str1.encode(encoding='utf-8'))  # 哈希str1,update的参数必须是bytes类型。返回hash类型对象

# print(m.digest())  # 消化(数字化)哈希对象:把哈希对象数字化
print(m1.hexdigest())  # 以16进制消化

m1.update(str2.encode(encoding='utf-8'))  # 继续update相当于把str1和str2拼接以后生成的哈希值。
print(m1.hexdigest())


str3 = str1 + str2
m2 = hashlib.md5()  # 重新初始化一个MD5的对象

m2.update(str3.encode(encoding='utf-8'))

print(m2.hexdigest())  # 结果应该和m1的最后结果相同

扩展:
黑客经常会用撞库的方式来破解密码! 撞库:因为MD5值不会变,可以用穷举法来找出原数据。(通过穷举法哈希字符串,结果如果是这个MD5值就能知道原数据) 所以知道数据库的MD5值,也是可以撞库被撞出来

脱库:被黑客拿到了数据库
加盐:在你的密码上,再给你加点东西或者进行一次运算后再哈希。(黑客不知道加盐的内容,所以很难反解出来)

2. 现在主流的加密算法:SHA

由于MD5的哈希结果位数较少,比较容易破解。 + MD5:哈希值128bit

  • SHA:哈希值根据规格有不同长度,最少的160bit

SHA是美国家安全局设计,由美国国家标准和技术研究院发布的一些列密码散列函数。

在2005年,由于MD5和SHA-1被山东大学的教授王小云破解了,科学家们又退出了SHA224,SHA256,SHA384,SHA512, 当然位数越长,破解难度越大,但同时生成加密的消息摘要所消耗的时间也更长。 目前最流行的是加密算法SHA-256 (https现在就是基于SHA-256,以前是SHA-1) (SSL2就是SHA-256)

SHA用法也和MD5一样:

import hashlib

str1 = 'hello world'
m1 = hashlib.sha256()  # 初始化一个SHA256的对象
m1.update(str1.encode(encoding='utf-8'))  # 哈希str1,update的参数必须是bytes类型。返回hash类型对象

print(m1.hexdigest())  # 以16进制消化
上一篇:像symfony2一样创建相同的哈希值(java-SHA-512)


下一篇:c# – .net中Sha256的更新功能在哪里?