python 密码加密与解密的实现
作者:黎陌MLing 发布时间:2023-07-31 04:32:38
由于计算机软件的非法复制,通信的泄密、数据安全受到威胁。一般为了安全,会要求将数据库名称、密码等信息进行加密。所以加密在开发过程中是经常使用到的技术,在一些重要场景中都有所应用,如:登录、支付、oauth等,场景不同需要搭配不一样的签名加密算法来达到业务目标。项目中用到了python端,需要用到python对密码的加密解密模块。
  加密算法分散列算法、对称加密、非对称加密。参考网上资料,初步将密码管理的逻辑思路整理了一下。
一、对称加密
就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。常见的对称算法有AES、DES、3DES等。
1.1 安装第三方库 - PyCrypto
对于对称加密或非对称都需要安装第三方库,Python中的密码库是PyCrypto,但在2012年已停止更新,现在使用 PyCrytodome 取代 PyCrypto 。
window下安装pycryptodemo,linux下安装pycrypto
pip install pycryptodome
示例如下:
1.2 加密实现
AES算法是目前应用最广泛的加密算法。AES有5种加密模式,分别是ECB, CBC, CTR, CFB, OFB。下面以AES的ECB模式为例,同样AES也需要加密秘钥aes_key,需要注意的是如果加密数据不足16或32位时需要补足为它们的倍数,下面以16的倍数为例:
先创建函数,不全数据不足16倍数的部分
def addStrToSpecifyLen(s,specifyLen=0):
"""
s不是specifyLen的倍数那就补足为specifyLen的倍数
:param s: 需要加密的参数
:param specifyLen: 指定参数的位数
:return: 补足位数的参数
"""
if specifyLen <= 0:
specifyLen = 1;
while len(s) % specifyLen != 0:
s += '\0'
return s.encode(encoding='utf-8')
加密算法 - aes
def encrypt_aes(text='', key=''):
"""
aes的ecb模式加密
:param data: 加密数据
:param aes_key: 加密的秘钥
:return: 加密之后的密文
"""
# 初始化加密器
aes = AES.new(addStrToSpecifyLen(key,16), AES.MODE_ECB)
# 先进行aes加密
encrypt = aes.encrypt(addStrToSpecifyLen(text,16))
# 用base64转成字符串形式
encrypted_text = str(base64.encodebytes(encrypt), encoding='utf-8') # 执行加密并转码返回bytes
return encrypted_text
解密算法
def decrypt_aes(data, aes_key):
"""
aes的ecb模式解密
:param data: 待解密数据
:param aes_key: 加密的秘钥
:return: 解密之后的数据
"""
# 初始化加密器
aes = AES.new(addStrToSpecifyLen(aes_key,16), AES.MODE_ECB)
#优先逆向解密base64成bytes
base64_decrypted = base64.decodebytes(addStrToSpecifyLen(data,16))
#执行解密密并转码返回str
decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','')
return decrypted_text
测试输出如下:
if __name__ == '__main__':
key = '12223'
data = 'test12dcds'
encrypt = encrypt_aes(data,key)
print(encrypt)
print(decrypt_aes(encrypt,key))
二、非对称加密
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。常见的非对称算法有RSA、DSA、ECC等。
三、摘要算法
Python的hashlib提供了常见的摘要算法,如MD5、SHA1、SHA224、SHA256、SHA384、SHA512等算法。摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。散列算法加密数据一般采用base64编码格式。常用的散列算示例如下:
3.1 md5加密
是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
import hashlib
hash = hashlib.md5()
hash.update("mayi".encode("utf-8"))
# 7d1080e20427559fcc0a647826741f66
print(hash.hexdigest())
3.2 sha1加密
SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。
import hashlib
hash = hashlib.sha1()
hash.update("mayi".encode("utf-8"))
# c159ce3114fb4553683cf96d91db6d51080c02e8
print(hash.hexdigest())
3.3 sha256加密
比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。
import hashlib
hash = hashlib.sha256()
hash.update("mayi".encode("utf-8"))
# 5dfae51e782cce2f213ef6bc89f75c9ab6c3bd8a5d1299a73191677cd5aa1f93
print(hash.hexdigest())
3.4 sha384加密
import hashlib
hash = hashlib.sha384()
hash.update("mayi".encode("utf-8"))
# a1eb5c52e830d5ea4fdb0a3dc2241374f56426aebacd8890a69c7db57724788ec5047a005ecff4a23310b7f87035926f
print(hash.hexdigest())
3.5 sha512加密
import hashlib
hash = hashlib.sha512()
hash.update("mayi".encode("utf-8"))
# 93102ec5658f739c060e3d82096e538ec116d0c9d6925119b465f0823be99697056518465cc6fe75265deb26632c8ce62b3d63a8782c492
daac2b9c03a89defe
print(hash.hexdigest())
3.6 “加盐”加密
以上加密算法虽然很厉害,但仍然存在缺陷,通过撞库可以反解。所以必要对加密算法中添加自定义key(通过加入用户名或者随机字符等)再来做加密。
import hashlib
hash = hashlib.md5('python'.encode('utf-8'))
hash.update("mayi".encode("utf-8"))
# b0758ad1aad20530044668775f389922
print(hash.hexdigest())
来源:https://blog.csdn.net/weixin_44462773/article/details/128854517


猜你喜欢
- 安装MySQL,留作笔记,不知是否能够安装成功,试试吧。1、 进入mysql官网 地址<下载完毕,接下来就是安装了2、安装找到安装包,
- 讲这个方法之前,我们应该先了解下插入节点时浏览器会做什么。在浏览器中,我们一旦把节点添加到document.body(或者其他节点)中,页面
- 首先,adb实现对设备的reboot命令是:adb reboot . 但是如果是两台/多台设备的时候,需要声明serial number:
- 1、bootstrapBootstrap 是Twitter推出的一个用于前端开发的,一个用于 HTML、CSS 和 JS 开发的开源工具包,
- 如何在页面错误时向数据库中添加记录?在ASP中,我在页面中添加了On Error Resume Next错误命令,以消除和避免程序错误。现在
- 平时写pyhton的时候习惯初始化一些list啊,tuple啊,dict啊这样的。一用到Pandas的DataFrame数据结构也就总想着初
- 1.在vue项目根目录下新建vue.config.js(不是在src下面)vue.config.js配置文件:module.exports
- 本文实例为大家分享了js实现直播点击飘心效果的具体代码,供大家参考,具体内容如下<!DOCTYPE html><html&
- 本文介绍TSV文件类型及其应用,同时介绍Golang语句读取TSV文件并转为struct的实现过程。认识TSV文件也许你之前不了解TSV文件
- 需求:(1) 获取你对象chrome前一天的浏览记录中的所有网址(url)和访问时间,并存在一个txt文件中(2)将这个txt文件发送给指定
- 关于Event:mysql5.1版本开始引进event概念。event既“时间触发器”,与triggers的事件触发不同,event类似与l
- replaceChild(a,b)是用来替换文档中的已有元素的 参数a:要插入的节点, 参数b:要替换的节点 var oDiv = docu
- requests是使用Apache2 licensed 许可证的HTTP库。用python编写。比urllib2模块更简洁。Request支
- 前言写过 CLI 常驻进程的老司机肯定遇到过这么一个问题:在需要更新程序的时候,我要怎样才能安全关闭老进程?你可能会想到 NGIN
- 本文实例讲述了python解析多层json操作。分享给大家供大家参考,具体如下:原始文件内容:{ "MaskPolyg
- 1.连接测试连接是否成功:import redisr = redis.Redis(host='192.168.136.102'
- 因为系统的一个Bug,导致数据库表中出现重复数据,需要做的是删除重复数据且只保留最新的一条数据。具体场景是这样的有张订单关联额外费用表,而且
- 每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者
- 如下所示:from bs4 import BeautifulSouppath = './web/new_index.html'
- 1. ES语法的getter和setter在开始了解 Vue 的数据响应式原理前应该先搞清楚 ES语法 中的 getter 和 setter