[Python Lib]-hashlib学习

# -*- coding: utf-8 -*-
"""
学习hashlib库

哈希是指通过一个函数,把任意长度的数据转换为一个长度固定的数据串
(通常用16进制的字符串表示)

Python的hashlib提供了常见的哈希算法(摘要算法)
其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512.等等。

每种算法的工作流程类似:
1. 构造一个对应算法的对象,例如h = hashlib.md5()
另外,模块中所定义的 new(name, string=”) 方法也可通过
指定系统所支持的hash算法来构造相应的hash对象.
2. 将要hash的内容传入h.update中,注意要传入的必须是bytes而非str


但是仅仅进行md5(或其他算法的加密)仍然不够安全
假如一个黑客已经拿到了存储MD5口令的数据库,他还是可以通过MD5反推用户的明文口令
可以考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令
于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表。
这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

由于常用口令的MD5值很容易被计算出来,所以要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5
这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
saltMd5 = mdt(s + [某个复杂字符串key])
"""
import hashlib


def md5(s):
    # 下面两种方式等价
    # md5Hash = hashlib.new('md5')
    md5Hash = hashlib.md5()

    # 使用update来进行加密,参数必须是byte,所以要先encode一下
    md5Hash.update(s.encode('utf-8'))
    # 注意,如果同一个hash对象重复调用该方法
    # 即m.update(a); m.update(b) == m.update(a+b)
    h1, h2 = hashlib.md5(), hashlib.new('md5')
    h1.update(b'aa')
    h1.update(b'bb')
    h2.update(b'aabb')
    print(h1.digest() == h2.digest())


    # 获取哈希值,区别在于一个用16进制的str表示,一个用byte表示
    hexDigest = md5Hash.hexdigest()
    digest = md5Hash.digest()
    # 生成的哈希的大小(以字节为单位)
    print(md5Hash.digest_size)
    # 散列算法的内部块大小(以字节为单位)
    print(md5Hash.block_size)
    print(type(hexDigest), hexDigest)
    print(type(digest), digest)

    # 使用copy可以拷贝对象
    h = md5Hash.copy()
    print(h.hexdigest())


def salt(s, key):
    h = hashlib.md5(key.encode('utf-8'))
    h.update(s.encode('utf-8'))
    print(h.hexdigest())




def main():
    query = '霜用英文说是frost'
    # 基本用法,以md5算法为例
    md5(query)
    salt(query, 'key')


if __name__ == '__main__':
    main()

输出:

True
16
64
<class 'str'> 7091b836391b4e3e1ebf5a829839c2f9
<class 'bytes'> b'p\x91\xb869\x1bN>\x1e\xbfZ\x82\x989\xc2\xf9'
7091b836391b4e3e1ebf5a829839c2f9
ed228a5ad6343bd3dbf609cd1fb21f53
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值