Python常用加密方式-加鹽加密-單向加密-解密


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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM