初始提交
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
import base64
|
||||
import hashlib
|
||||
|
||||
from cryptography.fernet import Fernet
|
||||
|
||||
from config.env import JwtConfig
|
||||
from exceptions.exception import ServiceException
|
||||
|
||||
|
||||
class CryptoUtil:
|
||||
"""
|
||||
加解密工具类
|
||||
"""
|
||||
|
||||
_cipher_suite = None
|
||||
|
||||
@classmethod
|
||||
def _get_cipher_suite(cls) -> Fernet:
|
||||
if cls._cipher_suite is None:
|
||||
# 使用 JWT secret key 派生 Fernet key
|
||||
# SHA256 hash (32 bytes) -> Base64 encoded (44 bytes) -> Fernet key
|
||||
key = base64.urlsafe_b64encode(hashlib.sha256(JwtConfig.jwt_secret_key.encode()).digest())
|
||||
cls._cipher_suite = Fernet(key)
|
||||
return cls._cipher_suite
|
||||
|
||||
@classmethod
|
||||
def encrypt(cls, data: str) -> str:
|
||||
"""
|
||||
加密字符串
|
||||
|
||||
:param data: 明文
|
||||
:return: 密文
|
||||
"""
|
||||
if not data:
|
||||
return data
|
||||
try:
|
||||
cipher_suite = cls._get_cipher_suite()
|
||||
encrypted_bytes = cipher_suite.encrypt(data.encode('utf-8'))
|
||||
return encrypted_bytes.decode('utf-8')
|
||||
except Exception as e:
|
||||
raise ServiceException('加密失败') from e
|
||||
|
||||
@classmethod
|
||||
def decrypt(cls, token: str) -> str:
|
||||
"""
|
||||
解密字符串
|
||||
|
||||
:param token: 密文
|
||||
:return: 明文
|
||||
"""
|
||||
if not token:
|
||||
return token
|
||||
try:
|
||||
cipher_suite = cls._get_cipher_suite()
|
||||
decrypted_bytes = cipher_suite.decrypt(token.encode('utf-8'))
|
||||
return decrypted_bytes.decode('utf-8')
|
||||
except Exception as e:
|
||||
raise ServiceException('解密失败') from e
|
||||
Reference in New Issue
Block a user