網站首頁 編程語言 正文
由于計算機軟件的非法復制,通信的泄密、數據安全受到威脅。一般為了安全,會要求將數據庫名稱、密碼等信息進行加密。所以加密在開發過程中是經常使用到的技術,在一些重要場景中都有所應用,如:登錄、支付、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
相關推薦
- 2022-07-11 Verilog中$display和$write任務以及格式化輸出
- 2022-10-18 CommonLisp中解析命令行參數示例_其它綜合
- 2022-09-27 Python?創建格式化字符串方法_python
- 2023-05-15 Go語言實現AES加密并編寫一個命令行應用程序_Golang
- 2022-10-23 Android?Handler源碼深入探究_Android
- 2022-06-02 ASP.NET?Core中的Blazor組件介紹_基礎應用
- 2023-04-18 Android?懸浮按鈕之實現兔兔按鈕示例_Android
- 2022-04-24 torch.utils.data.DataLoader與迭代器轉換操作_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支