python3 hashlib加密模块

如果你学习过密码学,那当然对密码的重要性是特别了解的,当今社会我们都把大量的时间花在了网络空间中,网络空间中的安全性也是日益严峻,无疑密码学是安全保障的基础,如果你还不会点密码学的只是就是太OUT了。

hashlib中的哈希函数

MD5

我们怎么对字符串('中国'),计算其摘要值呢?代码入下:

import hashlib

hash = hashlib.md5()
print(hash)
hash.update(bytes('中国', encoding='utf-8'))
print(hash.hexdigest())
print(hash.digest())

我们应该注意的是不同的字符串在使用不同的编码格式编码后在计算机内部保存的二进制数是不一样的,那么得到的摘要值(摘要值是哈希函数计算后生成的值就叫做摘要或者摘要值)。
比如我们分别用三种不同的编码,获取字符串('中国'),的三种字节串。

>>> bytes('中国', encoding='utf-8')
b'\xe4\xb8\xad\xe5\x9b\xbd'
>>> bytes('中国', encoding='GBK')
b'\xd6\xd0\xb9\xfa'
>>> bytes('中国', encoding='GB2312')
b'\xd6\xd0\xb9\xfa'

从以上可知utf-8编码和GBK、GB2312都不一样,而GBK和GB2312的编码是一样的。
从而我们可以获取三种编码对字符串('中国'),进行编码得到的摘要进行对比:

import hashlib

hash = hashlib.md5()
hash.update(bytes('中国', encoding='utf-8'))
print(hash.hexdigest()) #c13dceabcb143acd6c9298265d618a9f

hash = hashlib.md5()
hash.update(bytes('中国', encoding='GBK'))
print(hash.hexdigest()) # cf0832dedf7457bbcbfa00bbd87b300a

hash = hashlib.md5()
hash.update(bytes('中国', encoding='GB2312'))
print(hash.hexdigest()) #cf0832dedf7457bbcbfa00bbd87b300a

所以我们在使用哈希函数计算摘要的时候应该考虑到编码的格式,如果编码不同,或者说是编码后的二进制数据不同得到的摘要值是一定不同的。
hashlib模块中还有很多哈希算法,其中可以通过hashlib中的一个属性可以查看支持的哈希算法:

import hashlib
print(hashlib.algorithms_guaranteed)

哈希对象常用的方法

h = hashlib.md5() 或 h = hashlib.new("md5")

md5可以替换为其他的哈希类型

h.update(arg)

将字节对象arg填充到哈希对象中,arg通常为要加密的字符串

h.digest()

返回加密结果,它是一个字节对象,长度为 h.digest_size,包含的字节范围 0 ~ 255

h.hexdigest()

返回加密结果,它是一个字符串对象,长度为 h.digest_size * 2,只包含16进制数字

在开发的时候常常会用到哈希函数,但是只是单纯的哈希一次并不是很安全,然后就提出了一种加盐的操作,什么才是加盐呢,怎样才能让保存在数据库中的密码更安全呢?
这简书上找到一大佬写的文章,戳这里

copy下大佬的代码:(有的地方我做了小范围的修改,如果你需要可以直接copy拿走)

import hashlib
import binascii
import os

dk_len = 32  # 字节
salt_len = 32 # 字节
password_encrypt_version = 'v1'   # 自定义
iterations = 1000

def pbkdf2(salt, password):
    dk = hashlib.pbkdf2_hmac(hashlib.sha256().name, password.encode('utf8'), binascii.unhexlify(salt.upper()), iterations, dk_len)
    return binascii.hexlify(dk).decode(encoding='utf-8')

def encrypt_pass(password):
    salt = binascii.hexlify(os.urandom(salt_len))
    encrypted_pass = pbkdf2(salt, password)
    return '%s:%d:%s:%s' % (password_encrypt_version, iterations, salt.decode(encoding='utf-8'), encrypted_pass)


c = encrypt_pass('123')
print(c)

大佬文章中提到了他是参考了国外一大佬的文章,这里提供一个翻译过来的中文版:http://blog.jobbole.com/61872/
更安全的密码存储和验证方案,可以参考。



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值