python 密碼加密與解密的實(shí)現(xiàn)
由于計(jì)算機(jī)軟件的非法復(fù)制,通信的泄密、數(shù)據(jù)安全受到威脅。一般為了安全,會(huì)要求將數(shù)據(jù)庫(kù)名稱、密碼等信息進(jìn)行加密。所以加密在開(kāi)發(fā)過(guò)程中是經(jīng)常使用到的技術(shù),在一些重要場(chǎng)景中都有所應(yīng)用,如:登錄、支付、oauth等,場(chǎng)景不同需要搭配不一樣的簽名加密算法來(lái)達(dá)到業(yè)務(wù)目標(biāo)。項(xiàng)目中用到了python端,需要用到python對(duì)密碼的加密解密模塊。
加密算法分散列算法、對(duì)稱加密、非對(duì)稱加密。參考網(wǎng)上資料,初步將密碼管理的邏輯思路整理了一下。
一、對(duì)稱加密
就是采用這種加密方法的雙方使用方式用同樣的密鑰進(jìn)行加密和解密。密鑰是控制加密及解密過(guò)程的指令。算法是一組規(guī)則,規(guī)定如何進(jìn)行加密和解密。常見(jiàn)的對(duì)稱算法有AES、DES、3DES等。
1.1 安裝第三方庫(kù) - PyCrypto
對(duì)于對(duì)稱加密或非對(duì)稱都需要安裝第三方庫(kù),Python中的密碼庫(kù)是PyCrypto,但在2012年已停止更新,現(xiàn)在使用 PyCrytodome 取代 PyCrypto 。
window下安裝pycryptodemo,linux下安裝pycrypto
pip install pycryptodome
示例如下:
1.2 加密實(shí)現(xiàn)
AES算法是目前應(yīng)用最廣泛的加密算法。AES有5種加密模式,分別是ECB, CBC, CTR, CFB, OFB。下面以AES的ECB模式為例,同樣AES也需要加密秘鑰aes_key,需要注意的是如果加密數(shù)據(jù)不足16或32位時(shí)需要補(bǔ)足為它們的倍數(shù),下面以16的倍數(shù)為例:
先創(chuàng)建函數(shù),不全數(shù)據(jù)不足16倍數(shù)的部分
def addStrToSpecifyLen(s,specifyLen=0): """ s不是specifyLen的倍數(shù)那就補(bǔ)足為specifyLen的倍數(shù) :param s: 需要加密的參數(shù) :param specifyLen: 指定參數(shù)的位數(shù) :return: 補(bǔ)足位數(shù)的參數(shù) """ 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: 加密數(shù)據(jù) :param aes_key: 加密的秘鑰 :return: 加密之后的密文 """ # 初始化加密器 aes = AES.new(addStrToSpecifyLen(key,16), AES.MODE_ECB) # 先進(jìn)行aes加密 encrypt = aes.encrypt(addStrToSpecifyLen(text,16)) # 用base64轉(zhuǎn)成字符串形式 encrypted_text = str(base64.encodebytes(encrypt), encoding='utf-8') # 執(zhí)行加密并轉(zhuǎn)碼返回bytes return encrypted_text
解密算法
def decrypt_aes(data, aes_key): """ aes的ecb模式解密 :param data: 待解密數(shù)據(jù) :param aes_key: 加密的秘鑰 :return: 解密之后的數(shù)據(jù) """ # 初始化加密器 aes = AES.new(addStrToSpecifyLen(aes_key,16), AES.MODE_ECB) #優(yōu)先逆向解密base64成bytes base64_decrypted = base64.decodebytes(addStrToSpecifyLen(data,16)) #執(zhí)行解密密并轉(zhuǎn)碼返回str decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','') return decrypted_text
測(cè)試輸出如下:
if __name__ == '__main__': key = '12223' data = 'test12dcds' encrypt = encrypt_aes(data,key) print(encrypt) print(decrypt_aes(encrypt,key))
二、非對(duì)稱加密
與對(duì)稱加密算法不同,非對(duì)稱加密算法需要兩個(gè)密鑰:公開(kāi)密鑰(publickey)和私有密鑰(privatekey)。公開(kāi)密鑰與私有密鑰是一對(duì),如果用公開(kāi)密鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私有密鑰才能解密;如果用私有密鑰對(duì)數(shù)據(jù)進(jìn)行加密,那么只有用對(duì)應(yīng)的公開(kāi)密鑰才能解密。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對(duì)稱加密算法。常見(jiàn)的非對(duì)稱算法有RSA、DSA、ECC等。
三、摘要算法
Python的hashlib提供了常見(jiàn)的摘要算法,如MD5、SHA1、SHA224、SHA256、SHA384、SHA512等算法。摘要算法又稱哈希算法、散列算法。它通過(guò)一個(gè)函數(shù),把任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長(zhǎng)度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)。
一般用于網(wǎng)絡(luò)通信中消息加密,前提是雙方先要約定好key,就像接頭暗號(hào)一樣,然后消息發(fā)送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 發(fā)送者的相對(duì)比是否相等,這樣就能驗(yàn)證消息的真實(shí)性,及發(fā)送者的合法性了。
摘要算法之所以能指出數(shù)據(jù)是否被篡改過(guò),就是因?yàn)檎瘮?shù)是一個(gè)單向函數(shù),計(jì)算f(data)很容易,但通過(guò)digest反推data卻非常困難。而且,對(duì)原始數(shù)據(jù)做一個(gè)bit的修改,都會(huì)導(dǎo)致計(jì)算出的摘要完全不同。散列算法加密數(shù)據(jù)一般采用base64編碼格式。常用的散列算示例如下:
3.1 md5加密
是最常見(jiàn)的摘要算法,速度很快,生成結(jié)果是固定的128 bit字節(jié),通常用一個(gè)32位的16進(jìn)制字符串表示。
import hashlib hash = hashlib.md5() hash.update("mayi".encode("utf-8")) # 7d1080e20427559fcc0a647826741f66 print(hash.hexdigest())
3.2 sha1加密
SHA1的結(jié)果是160 bit字節(jié),通常用一個(gè)40位的16進(jìn)制字符串表示。
import hashlib hash = hashlib.sha1() hash.update("mayi".encode("utf-8")) # c159ce3114fb4553683cf96d91db6d51080c02e8 print(hash.hexdigest())
3.3 sha256加密
比SHA1更安全的算法是SHA256和SHA512,不過(guò)越安全的算法越慢,而且摘要長(zhǎng)度更長(zhǎng)。
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 “加鹽”加密
以上加密算法雖然很厲害,但仍然存在缺陷,通過(guò)撞庫(kù)可以反解。所以必要對(duì)加密算法中添加自定義key(通過(guò)加入用戶名或者隨機(jī)字符等)再來(lái)做加密。
import hashlib hash = hashlib.md5('python'.encode('utf-8')) hash.update("mayi".encode("utf-8")) # b0758ad1aad20530044668775f389922 print(hash.hexdigest())
到此這篇關(guān)于python 密碼加密與解密的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python 密碼加密與解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用python實(shí)現(xiàn)九九乘法表實(shí)例
大家好,本篇文章主要講的是用python實(shí)現(xiàn)九九乘法表實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01pytorch查看網(wǎng)絡(luò)參數(shù)顯存占用量等操作
這篇文章主要介紹了pytorch查看網(wǎng)絡(luò)參數(shù)顯存占用量等操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05Python實(shí)現(xiàn)list反轉(zhuǎn)實(shí)例匯總
這篇文章主要介紹了Python實(shí)現(xiàn)list反轉(zhuǎn)的方法,實(shí)例總結(jié)了關(guān)于list的各種較為常見(jiàn)的操作技巧,需要的朋友可以參考下2014-11-11python方法生成txt標(biāo)簽文件的實(shí)例代碼
今天小編就為大家分享一篇python方法生成txt標(biāo)簽文件的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python接口開(kāi)發(fā)實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了Python接口開(kāi)發(fā)實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04把vgg-face.mat權(quán)重遷移到pytorch模型示例
今天小編就為大家分享一篇把vgg-face.mat權(quán)重遷移到pytorch模型示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12基于Django實(shí)現(xiàn)日志記錄報(bào)錯(cuò)信息
這篇文章主要介紹了基于Django實(shí)現(xiàn)日志記錄報(bào)錯(cuò)信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12