Python学习之加密模块使用详解

目录
  • hashlib 模块
    • hashlib 模块的介绍
    • hashlib 模块中的常用加密方法
    • hashlib模块情景练习
  • base64 模块
    • base64 模块的介绍
    • base64 模块 模块中的常用方法
    • base64 模块的情景练习

hashlib 模块

hashlib 模块的介绍

hashlib 模块中拥有很多的加密算法,我们并不需要关心加密算法的实现方法。只需要调用我们需要的加密函数,就可以帮助我们对数据进行加密。

它的加密算法有很多,不仅如此,hashlib 中很多加密算法加密难度很大,所以加密后的数据很难被破解(这里的很难被破解是相对而言的,比如MD5、sha1、mysql、ntlm就可以在cmd5 通过穷举的方式进行明密文的对应查询。),这就是 hashlib 强大的地方。既然无法破解也就无法解密,所以hashlib 中的加密方法都是不可逆的。

hashlib 模块中的常用加密方法

接下来就让我们看一下 hashlib 中常用的加密算法:

函数名 参数 介绍 举例 返回值
md5 byte md5算法加密 hashlib.md5(b’hello’) hash对象
sha1 byte sha1算法加密 hashlib.sha1(b’hello’) hash对象
sha256 byte sha256算法加密 hashlib.sha256(b’hello’)  hash对象
sha512 byte sha512算法加密 hashlib.512(b’hello’)  hash对象

以上的加密函数都有一个 byte 类型的参数,通过调用对应的函数会返回一个 hash对象。所谓 hashlib 就是一种加密方式。

sha1、sha256、sha512 的区别就是 数值越高,被破解的概率就越低。

hashlib 模块生成加密字符串示例:

import hashlib

hashobj = hashlib.md5(b'Hello_World')	# 将 'Hello_World'以 byte 形式传入,通过 md5 加密 赋值给 hashobj 对象
result = hashobj.hexdigest()			# hashobj 通过 hexdigest() 函数的16进制生成加密字符串赋值给 result
print(result)

# >>> 执行结果如下:
# >>> 486b98e454e54f44e811b9c62857f8f7

hashlib模块情景练习

大家可能有一个疑问, hashlib 模块加密后的无法解密获取原始数据,那我们加密后的信息有什么用呢?实际上场景有很多,我们今天就来举例一个场景。

比如我们的用户需要某一个服务的帮助,用户每次请求服务都需要一个凭证。这个凭证信息是通过加密的方式生成的字符串,并且该加密方式是双方达成一致,标准相同的。当用户请求该服务的时候,带上这个加密的字符串,服务会通过响应的加密规范也生成一个字符串。如果用户带过来的凭证的字符串与服务计算出来的凭证的字符串完全一致,则证明用户请求的这个服务是一个合法的请求,反之则不合法。

那么定义这样一个认证签名字符串就需要两个数据和一个模块,模块就是 hashlib ,数据1就是 用户与服务之间达成共识的一个基础签名 ,我们定义它为 bash_sign ;数据2我们可以使用 用户请求服务生成凭证的时间戳,我们定义它为 user_timestamp 。

代码示例如下:

# coding:utf-8

import hashlib
import time

bash_sign = 'signature'  # 定义一个基础签名变量

def user_request_client():          # TODO 用户签名
    user_time = int(time.time())    # 获取用户请求服务生成凭证的时间戳 ;python 的时间戳是浮点类型,这里转成整型。
    _token = '%s%s' % (bash_sign, user_time)             # 定义一个加密之前的token,将 bash_sign 与 user_time 传入
    hashobj = hashlib.sha1(_token.encode('utf-8'))       # 由于参数是 byte 类型,所以我们需要将 _token 进行编码
    user_token = hashobj.hexdigest()        # 将 bash_sign 与 user_time 通过 sha1 加密的字符串 赋值给 user_token
    return user_token, user_time

def service_check_token(token, user_timestamp):          # TODO 服务器校验签名
    _token = '%s%s' % (bash_sign, user_timestamp)        # 服务器接收用户请求传入的 token 与 时间戳
    service_token = hashlib.sha1(_token.encode('utf-8')).hexdigest()     # 服务器的 token ,加密方式与用户请求加密方式一致
    if token == service_token:      # 校验加密串的合法性,若校验不通过,拒绝用户的服务请求
        # print(token, '---', user_timestamp)
        return True
    else:
        return False

if __name__ == '__main__':
    need_help_token, timestamp = user_request_client()
    # time.sleep(1)                 # 取消注释后,时间错不一致则会 签名校验不通过
    # result = service_check_token(need_help_token, time.time())

    result = service_check_token(need_help_token, timestamp)
    if result == True:
        print('用户请求服务签名校验通过,服务器提供对应服务')
    else:
        print('用户请求服务签名校验未通过,服务器拒绝提供对应服务')

# >>> 执行结果如下:
# >>> 用户请求服务签名校验通过,服务器提供对应服务

所以这一种验证需要两个方面,第一个就是我们生成传入的 token 以及 时间戳,第二个就是 token 是否是按照我们定义好的标准生成的;

这两个不管是那一个出错了,服务器校验签名都是不通过。这也是 hashlib 模块 常用的场景之一,大家也可以尝试拓展一下思维,还有哪些场景适用于这种不可逆的算法。

base64 模块

base64 模块的介绍

base64 加密模块也是一种通用型的加密算法,与之前我们讲的 json 模块一样,在很多编程语言中都有 base64模块且功能基本相同。 所以在任何编程语言中,都可以将base64加密的字符串进行解密。

既然都可以进行解密,那么带来的问题就是没有安全可言了。其实不然,我们自然有办法去解决。稍后我们通过一个小练习来解决这个问题。

base64 模块 模块中的常用方法

函数名 参数 介绍 举例 返回值
encodestring byte 进行base64加密 base64.encodestring(b’string’) byte
decodestring byte 进行base64解密 base64.decodestring(b’c3RyaW5n\n’) byte
encodebytes byte 进行base64加密 base64.encodebytes(b’string’) byte
decodebytes byte  进行base64解密 base64.decodebytes(b’c3RyaW5n\n’) byte

注意:encodestring()函数 与 decodestring() 函数 虽然从名字上来看是对 字符串 进行 加密解密,但是在用法上需要对字符串进行 byte 类型的转换,然后再执行对应的加密解密操作。

encodebytes()函数 与 decodebytes() 函数 功能、参数、返回值 与字符串加解密一致,实际上在 python3.x 中,官方更推荐使用着一组函数进行加密和解密。

base64 模块的情景练习

接下来我们看一下 base64 模块的 加解密演示那里:

注意:由于无论如何我们都需要通过 byte 类型进行数据的加密与解密,所以我们可以对加密、解密进行一个封装。

# coding:utf-8

import base64

def encode(data):       # 编码函数
    if isinstance(data, str):           # 判断传入的 data 的数据类型
        data = data.encode('utf-8')
    elif isinstance(data, bytes):
        data = data
    else:
        raise TypeError('传输的 \'data\' 参数需为 bytes 或 str 类型')

    # print(base64.encodebytes(data))
    # print(base64.encodebytes(data).decode('utf-8'))
    return base64.encodebytes(data).decode('utf-8')     # 加密后的 data 格式为byte类型,需要进行解码为字符串,参考上两行代码

def decone(data):
    if not isinstance(data, bytes):
        raise TypeError('传输的 \'data\' 参数需为 bytes 类型')

    return base64.decodebytes(data).decode('utf-8')

if __name__ == '__main__':
    result = encode('signature')
    print('base64 编码后的结果为:', result)

    new_result = decone(result.encode('utf-8'))
    print('base64 解码后的结果为:', new_result)

# >>> 执行结果如下:
# >>> base64 编码后的结果为: c2lnbmF0dXJl
# >>> base64 解码后的结果为: signature

但是就像上文我们提及的一样,既然所有人都知道 base64 的加密方式与解密方式,那我们该如何是好呢?其实也很简单,那就是对我们的 base64 加密的密文进行字符串替换的二次输出。(所谓的二次输出,其实就是二次转换的过程。)

比如我们定义三个字符串专门用作加密后的某个字符的替换,代码示例如下:

# coding:utf-8

import base64

replace_one = '$'
replace_two = '%'
replace_three = '='

def encode(data):       # 编码函数
    if isinstance(data, str):           # 判断传入的 data 的数据类型
        data = data.encode('utf-8')
    elif isinstance(data, bytes):
        data = data
    else:
        raise TypeError('传输的 \'data\' 参数需为 bytes 或 str 类型')

    # print(base64.encodebytes(data))
    # print(base64.encodebytes(data).decode('utf-8'))
    _data = base64.encodebytes(data).decode('utf-8')     # 加密后的 data 格式为byte类型,需要进行解码为字符串,参考上两行代码
    _data = _data.replace('c', replace_one).replace('2', replace_two).replace('l', replace_three)   # 替换 'c'、'2'、'l'
    return _data

def decone(data):
    if not isinstance(data, bytes):
        raise TypeError('传输的 \'data\' 参数需为 bytes 类型')

    return base64.decodebytes(data).decode('utf-8')

if __name__ == '__main__':
    result = encode('signature')
    print('base64 编码后的结果为:', result)

    new_result = decone(result.encode('utf-8'))
    print('base64 解码后的结果为:', new_result)

执行结果如下:

既然加密进行了二次转换,那么解密的时候同样需要进行二次转换才行,所以我们需要重构一下 decone() 函数。

def decone(data):
    if not isinstance(data, bytes):
        raise TypeError('传输的 \'data\' 参数需为 bytes 类型')

    replace_one_decone = replace_one.encode('utf-8')        # 需要将二次转换的变量已 byte 的形式进行解码
    replace_two_decone = replace_two.encode('utf-8')
    replace_three_decone = replace_three.encode('utf-8')

    data = data.replace(replace_one_decone, b'c').replace(replace_two_decone, b'2').replace(replace_three_decone, b'l')

    return base64.decodebytes(data).decode('utf-8')

运行结果如下:

小节:通过这种方法,只有具体的开发人员与使用的业务人员才知道这种二次替换的方式,需要通过那些字符进行加密或者解密。从而提高了数据传输的安全性。

到此这篇关于Python学习之加密模块使用详解的文章就介绍到这了,更多相关Python加密模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python中的hashlib和base64加密模块使用实例

    看到好几位博主通过对模块的各个击破学习python,我也效法一下,本篇说一下python中加密涉及到的模块. hashlib hashlib模块支持的加密算法有md5 sha1 sha224 sha256 sha384 sha512(加密原理请参考此处),使用起来也很简单. 以md5加密为例,有两种方法: 一. 追加模式 代码示例: 复制代码 代码如下: import hashlib #引入hashlib模块    mm = hashlib.md5() #创建一个md5对象  mm.update

  • Python hashlib加密模块常用方法解析

    这篇文章主要介绍了Python hashlib加密模块常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要用于对字符串的加密,最常用的为MD5加密: import hashlib def get_md5(data): obj = hashlib.md5() obj.update(data.encode('utf-8')) result = obj.hexdigest() return result val = get_md5('12

  • Python内置加密模块用法解析

    这篇文章主要介绍了Python内置加密模块用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 数据加密: 对称加密:数据加密和解密使用相同的密钥,主要解决数据的机密性(DES,AES) 非对称加密(公匙加密):数据加密和解密使用的不同密钥,主要用于身份的验证(DSA,RSA) 单向加密:只能加密不能解密,主要用于解决数据的完整性(MD5,SHA系列算法) Python内置加密模块: hashlib 主要提供了一些常见的单向加密算法(如MD5

  • Python加密模块的hashlib,hmac模块使用解析

    这篇文章主要介绍了Python加密模块的hashlib,hmac模块使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在写搬砖脚本中,碰到一个加密的信号标签文件无法运行. import hashlib import time m = hashlib.md5() api_key = '' api_secret = '' params = {'api_key':api_key, 'time':int(time.time()), 'symbol

  • python的一些加密方法及python 加密模块

    1base64 Python内置的base64模块可以实现base64.base32.base16.base85.urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形式,2.x可以是字符串形式. base64模块的base64编码.解码调用了binascii模块,binascii模块中的b2a_base64()函数用于base64编码,binascii模块中的a2b_base64()函数用于base64解码. import base64 s = 'hello, w

  • Python字符串hashlib加密模块使用案例

    主要用于对字符串的加密,最常用的为MD5加密: import hashlib def get_md5(data): obj = hashlib.md5() obj.update(data.encode('utf-8')) result = obj.hexdigest() return result val = get_md5('123') #这里放入要加密的字符串文字. print(val) #简便的写法: pwd = input('请输入密码:').encode('utf-8') result

  • Python学习之加密模块使用详解

    目录 hashlib 模块 hashlib 模块的介绍 hashlib 模块中的常用加密方法 hashlib模块情景练习 base64 模块 base64 模块的介绍 base64 模块 模块中的常用方法 base64 模块的情景练习 hashlib 模块 hashlib 模块的介绍 hashlib 模块中拥有很多的加密算法,我们并不需要关心加密算法的实现方法.只需要调用我们需要的加密函数,就可以帮助我们对数据进行加密. 它的加密算法有很多,不仅如此,hashlib 中很多加密算法加密难度很大,

  • Python学习之循环方法详解

    目录 for循环 while循环 拓展:列表推导式 常见的推导式方法 循环的继续与退出(continue与break) continue的使用 break的使用 循环实现九九乘法表 什么是循环? —> 循环是有着周而复始的运动或变化的规律:在 Python 中,循环的操作也叫做 ‘遍历’ . 与现实中一样,Python 中也同样存在着无限循环的 方法与有限循环的方法.接下来我们就先看看有限循环的方法 —> for 循环 for 循环 for 循环的功能:通过 for 关键字将列表.元组.字符串

  • Python学习之面向对象编程详解

    目录 什么是面向对象编程(类) 类的关键字-class 类的定义与使用 类的参数-self self的解析与总结 类的构造函数 构造函数的创建方法 关于对象的生命周期 什么是面向对象编程(类) 利用(面向)对象的(属性和方法)去进行编码的过程即面向对象编程 自定义对象数据类型就是面向对象中的类(class)的概念 类的关键字 - class class 关键字用来声明类,类的名称首字母大写,多单词的情况下每个单词首字母大写(即驼峰命名法).在我们一开始学习 Python 的时候说过,要尽量避免使

  • Python学习之异常断言详解

    该章节我们来学习 异常的最后一个知识点 - 断言 ,断言是判断一个表达式,在表达式为 False 的时候触发异常.表达式我们可以对号入座,可以是条件语句中的声明,也可以是是 while 循环中的声明. 它们都是对一件事情进行 True 或者 False 的判断, 断言 也是如此,断言发现后面的表达式为 False 的时候 就会主动抛出异常. 在 Python 中 assert 就是断言的关键字,乍一听起来 似乎和 raise 关键字 的功能一样.其实 assert 断言的使用要比 raise 更

  • Python学习之日志模块详解

    目录 日志的作用 日志的等级 logging 模块的使用 logging 模块演示小案例 OK,今天我们来学习一下 python 中的日志模块,日志模块也是我们日后的开发工作中使用率很高的模块之一,接下来们就看一看今天具体要学习日志模块中的那些内容吧. 日志的作用 说到日志,我们完全可以想象为现实生活中的日记.日记是我们平时记录我们生活中点点滴滴的一种方法,而日志我们可以认为是 程序的日记 ,程序的日记是用来记录程序的行为,一般来说我们可以通过日志记录一些程序的重要信息. 比如哪里报错了?报错原

  • Python学习之虚拟环境原理详解

    目录 认识虚拟环境 Python中的虚拟环境工具 Virtualenv Treminal 终端演示 该章节我们学习虚拟环境的相关知识,虚拟环境对于刚刚使用Python的初学者来说使用的概率可能会比较低.但是我们依然要对它有一定的了解. 认识虚拟环境 在我们平时的工作环境中,可能会存在一台电脑存在多个版本的 python 的情况 . 比如我们有一个 Python2.7的版本,还有一个 Python3.8的环境,它们两个都存在与我们当前的系统中.这就造成了一个问题,两个版本都在同一个环境下,造成 p

  • Python集成学习之Blending算法详解

    一.前言 普通机器学习:从训练数据中学习一个假设. 集成方法:试图构建一组假设并将它们组合起来,集成学习是一种机器学习范式,多个学习器被训练来解决同一个问题. 集成方法分类为: Bagging(并行训练):随机森林 Boosting(串行训练):Adaboost; GBDT; XgBoost Stacking: Blending: 或者分类为串行集成方法和并行集成方法 1.串行模型:通过基础模型之间的依赖,给错误分类样本一个较大的权重来提升模型的性能. 2.并行模型的原理:利用基础模型的独立性,

  • Python标准库学习之psutil内存详解

    目录 查询CPU信息 查询内存信息 查询磁盘信息 查询网络信息 查询进程信息 人生苦短,快学Python! 今天介绍的是psutil模块,它是一个跨平台库 https://github.com/giampaolo/psutil 命令行下通过pip安装: pip install psutil 如果跟我一样安装的是Anaconda,则剩下这步了,因为自带了. 顾名思义 psutil = process and system utilities 它专门用来获取操作系统以及硬件相关的信息,比如:CPU.

  • Python OpenCV学习之图像滤波详解

    目录 背景 一.卷积相关概念 二.卷积实战 三.均值滤波 四.高斯滤波 五.中值滤波 六.双边滤波 七.Sobel算子 八.Scharr算子 九.拉普拉斯算子 十.Canny算法 背景 图像滤波的作用简单来说就是将一副图像通过滤波器得到另一幅图像:明确一个概念,滤波器又被称为卷积核,滤波的过程又被称为卷积:实际上深度学习就是训练许多适应任务的滤波器,本质上就是得到最佳的参数:当然在深度学习之前,也有一些常见的滤波器,本篇主要介绍这些常见的滤波器: 一.卷积相关概念 卷积核大小一般为奇数的原因:

  • Python Pandas学习之基本数据操作详解

    目录 1索引操作 1.1直接使用行列索引(先列后行) 1.2结合loc或者iloc使用索引 1.3使用ix组合索引 2赋值操作 3排序 3.1DataFrame排序 3.2Series排序 为了更好的理解这些基本操作,下面会通过读取一个股票数据,来进行Pandas基本数据操作的语法介绍. # 读取文件(读取保存文件后面会专门进行讲解,这里先直接调用下api) data = pd.read_csv("./data/stock_day.csv")  # 读取当前目录下一个csv文件 # 删

随机推荐