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
猜你喜欢
- 一、 网页设计中的对比原则一件网页设计作品由许多元素构成,它们的重要性各不相同,其中一些元素的重要性要高于其它元素。一些相互关联,而另一些则
- 写过PHP+MySQL的程序员都知道有时间差,UNIX时间戳和格式化日期是我们常打交道的两个时间表示形式,Unix时间戳存储、处理方便,但是
- 1.通过pip安装python第三方模块paramikopip install paramiko2.创建脚本##导入paramiko、tim
- PHP是一种面向对象的编程语言,它允许开发者使用面向对象的编程技术来构建复杂的应用程序。下面是一些关于PHP面向对象编程的讲解:类与对象类是
- 以前见过一个很漂亮的网页提示信息,就是把鼠标放到网页的文字或者图片上面就会有提示的那种透明的,还带个箭头,很漂亮,不知道谁在哪见过没有,感谢
- 运行代码框<SCRIPT>var oPopup = window.createPopup();var popTop=50;fun
- <% If Err.Number <> 0 Th
- 如何修改被表单引用的ASP页面?formhandler.asp<HTML><BODY BGCOLOR="
- js关于 byval 与 byref 二者区别: byval 传递数值,实参和形参分处不同的内存单元,互不干扰! byref 传递地址,实参
- 自动更新统计信息的基本算法是: · 如果表格是在 tempdb 数据库表的基数是小于 6,自动更新到表的每个六个修改。 · 如果表的基数是大
- 能评估使用方法性能评估模块提供了一系列用于模型性能评估的函数,这些函数在模型编译时由metrics关键字设置性能评估函数类似与目标函数, 只
- 在近几年Python的呼声越来越高,很多刚开始起步想要学习编程的朋友都会犹豫要不要选择学习Python,毕竟作为人工智能时代的首选语言这个诱
- Macromedia StandardMacromedia Dreamweaver MXMenu Commandsphotoshop快捷键大
- < SCRIPT LANGUAGE="VBScript"> < 
- 在mysql安装目录的bin下, 运行mysql --install MYSQL5查看服务中, 会多一个MYSQL5的服务XAMPP的控制面
- 一、控制用户存取 1、创建修改用户Creating Users Create/alter user new_user identified
- 在XHTML标签中有一些标签的作用是相似的,当然这里的相似是指语义相似,以至于很多人都不清楚这些相似的标签如何使用,那么今天的主题就是分解相
- 1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES W
- 一、检测网络信息和系统信息 在Frontpage 2000 的Explorer管理器中选择帮助(Help)|关于Frontpage管理器(A
- ajax编程获取Google的PageRank3(PR值)及所在目录,想给你的站增加Google PR查询的功能吗?如果你不会就看看本文吧,