python hashlib模块--学习笔记

python hashlib模块--学习笔记

目录

简介:

主要用途:

用于用户登陆口令存储

应用代码示例及原码学习

import hashlibimport ospassword = "abcdefghijk".encode("utf-8")salt = os.urandom(32)print(salt)# >>b']\xd6B6\x083\x81\xf6\x8a\t\xfb\x05\xcdDI\xbd\x84y>&\x80b\x9cg\xbfwT~\xa1\x84N\x9d'md5 = hashlib.md5()md5.update(password+salt)print(md5.hexdigest())# >>99edc107e9b480421d4ebd19f0f8b9bd


简介:

Python内置的hashlib模块为我们提供了多种安全方便的摘要方法,如MD5,SHA1等,通俗的理解MD5算法,输入任意长度的数据,输出为固定长度的数据串(数字通常是16进制)很重要的一点:哈希算法是一个单向函数,无法反推(但也不是绝对的)在大部分操作系统下,hashlib模块支持md5(),sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(),blake2s(),sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256()等多种hash构造方法。这些构造方法在使用上通用,返回带有同样接口的hash对象,对算法的选择,差别只在于构造方法的选择。例如sha1()能创建一个SHA-1对象,sha256()能创建一个SHA-256对象。然后就可以使用通用的update()方法将bytes类型的数据添加到对象里,最后通过digest()或者hexdigest()方法获得当前的摘要。

# This tuple and __get_builtin_constructor() must be modified if a new
# always available algorithm is added.
__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
                      'blake2b', 'blake2s',
                      'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512',
                      'shake_128', 'shake_256')

主要用途:

  • 可以判断一段数据是否被篡改
  • 用于网站登陆用户口令的存储

用于用户登陆口令存储

对于用户来说一般登陆网站或者应用都是有登陆账号和密码的.我们一般的做法都是会将这些口令数据映射起来存储到数据库中,用户登录需要使用密码,密码一定要加密,保证用户的信息安全。当用户登录时,首先计算用户输入的明文口令的摘要值,然后和数据库存储的摘要值进行对比。如果两者一致,说明口令输入正确,如果不一致,口令肯定错误。这样,不但数据库不用储存明文密码,即使能访问数据库的管理员“叛变”了,盗走了整个数据库,也无法获知用户的明文口令。
  1)加密可以使用hashlib模块进行加密。
  2)加密可以写成加密函数,方便多处调用
  3)提高密码解密的复杂性,代码中多加字符串。(加密算法虽然依然非常厉害,但是也存在缺陷,即:通过撞库可以反解。所以,有必要对加密密码进行加盐。)

应用代码示例及原码学习


import hashlib
import os
password = "abcdefghijk".encode("utf-8")
salt = os.urandom(32)
print(salt)
# >>b']\xd6B6\x083\x81\xf6\x8a\t\xfb\x05\xcdDI\xbd\x84y>&\x80b\x9cg\xbfwT~\xa1\x84N\x9d'
md5 = hashlib.md5()
md5.update(password+salt)
print(md5.hexdigest())
# >>99edc107e9b480421d4ebd19f0f8b9bd

def __hash_new(name, data=b'', **kwargs):
    """new(name, data=b'') - Return a new hashing object using the named algorithm;
    optionally initialized with data (which must be a bytes-like object).
    """
    if name in {'blake2b', 'blake2s'}:
        # Prefer our blake2 implementation.
        # OpenSSL 1.1.0 comes with a limited implementation of blake2b/s.
        # It does neither support keyed blake2 nor advanced features like
        # salt, personal, tree hashing or SSE.
        return __get_builtin_constructor(name)(data, **kwargs)
    try:
        return _hashlib.new(name, data)
    except ValueError:
        # If the _hashlib module (OpenSSL) doesn't support the named
        # hash, try using our builtin implementations.
        # This allows for SHA224/256 and SHA384/512 support even though
        # the OpenSSL library prior to 0.9.8 doesn't provide them.
        return __get_builtin_constructor(name)(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信息化未来

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值