Python 常用后端密碼加密方式
1.單向加密-不可解密-除非撞庫
實現思路:
在存儲用戶信息的表中,增加passwod字段,salt字段
passsword:加密后的密文
salt:由加密時,隨機生成的鹽字段
當用戶修改密碼時或管理員給重置密碼時,此時隨機生成鹽salt,與新密碼進行加密,只需要將鹽和密文存儲到數據庫,這種方法,可以防止反向破解出密碼
常用加密hmac代碼:
digestmod:此參數是加密方式,還有很多種......
def password_new(salt, password, dig='sha1'):
"""
:param salt: 鹽
:param password: 加密的字符
:return:
"""
h1 = hmac.new(key.encode(), password.encode(), digestmod=dig)
return h1.hexdigest()
if __name__ == '__main__':
print(password_new('123456','yangbeita'))
sha1 加密
import hashlib
import random
sha1 = hashlib.sha1()
s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
salt = ""
for i in range(8):
salt+=random.choice(s)
# data = '2333333{salt}'.format(salt=salt)
data = '123456'
sha1.update(data.encode('utf-8'))
sha1_data = sha1.hexdigest()
print(sha1_data)
md5加密
def md5(s):
s = s.encode("utf8")
m = hashlib.md5()
m.update(s)
return m.hexdigest()
2.加密-解密
base64 加密
import base64
str = 'hello world'.encode(encoding='utf-8')
# 加密
encodestr = base64.b64encode(str)
print(encodestr) # b'aGVsbG8gd29ybGQ='
print(encodestr.decode()) # aGVsbG8gd29ybGQ=
# 解密
decodestr = base64.b64decode(encodestr)
print(decodestr) # b'hello world'
print(decodestr.decode()) # hello world
RSA 加密--此方式還有解密,本文不附帶
加密
from Crypto.Cipher import DES3
from Crypto import Random
import binascii
key = 'Sixteen byte key'
msg = 'sona si latine loqueris '
iv = Random.new().read(DES3.block_size)
# print(iv)
def des3_encrypt(key, msg):
cipher = DES3.new(key, DES3.MODE_OFB, iv)
msg = iv + cipher.encrypt(msg)
msg = binascii.b2a_hex(msg)
return msg.decode()
s = des3_encrypt(key.encode(), msg.encode())
print(s)
第三方模塊加密
from cryptography.fernet import Fernet
import random
s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
salt = ""
for i in range(32):
salt += random.choice(s)
print(salt.encode())
# 加密
password = Fernet(b'pXVAHabI4HADuM-fyVogxwV5rHRN1pZe-QQ3yM9ZvPg=').encrypt('yang'.encode()).decode()
print(password)
# 解密
b = Fernet(b'pXVAHabI4HADuM-fyVogxwV5rHRN1pZe-QQ3yM9ZvPg=').decrypt("gAAAAABhYUWM11tfqIyVD1DDIIFG65wdw0hkSXTT84nk1r5fohqL6MUKvQgHpQ2skdo60q9TMzhgM4UDehkla9OKnK0NFa2_hA==".encode()).decode()
print(b)
采用AES 對稱加密算法
import base64
from Crypto.Cipher import AES
'''
采用AES對稱加密算法
'''
# str不是16的倍數那就補足為16的倍數
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'
return str.encode(value) # 返回bytes
#加密方法
def encrypt_oracle():
# 秘鑰
key = '123456'
# 待加密文本
text = 'yang'
# 初始化加密器
aes = AES.new(add_to_16(key), AES.MODE_ECB)
#先進行aes加密
encrypt_aes = aes.encrypt(add_to_16(text))
#用base64轉成字符串形式
encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') # 執行加密並轉碼返回bytes
print(encrypted_text.strip()) # 自己加的的strip, 后面會有一個換行符
print(encrypt_aes)
#解密方法
def decrypt_oralce():
# 秘鑰
key = '123456'
# 密文
text = 'XUfQ4HigfgageIzlmuldgw=='
# 初始化加密器
aes = AES.new(add_to_16(key), AES.MODE_ECB)
#優先逆向解密base64成bytes
base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8'))
#
decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8') # 執行解密密並轉碼返回str
print(decrypted_text)
if __name__ == '__main__':
encrypt_oracle()
decrypt_oralce()