如何在AWS Lambda中用Python cryptography解密JS-AES加密值?
使用Python cryptography解密JS AES加密值(适配AWS Lambda)
你的加密值是OpenSSL Salted AES格式(常见于CryptoJS等JS加密库),以下是用cryptography库解密的步骤和代码:
核心逻辑
- 解码Base64字符串,分离出salt和密文(前8字节是固定标识"Salted__",接下来8字节是salt,剩余为密文)
- 通过PBKDF2HMAC算法,从密码和salt推导AES密钥和IV(CryptoJS默认用SHA1、1000次迭代生成32位密钥+16位IV)
- 用AES-CBC模式解密,处理PKCS7填充
解密代码
import base64 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import padding def decrypt_aes(encrypted_b64, password): # 解码Base64 encrypted_data = base64.b64decode(encrypted_b64) # 分离标识、salt、密文 assert encrypted_data[:8] == b"Salted__" salt = encrypted_data[8:16] ciphertext = encrypted_data[16:] # 推导密钥和IV(CryptoJS默认参数) kdf = PBKDF2HMAC( algorithm=hashes.SHA1(), length=48, # 32位key + 16位IV salt=salt, iterations=1000, backend=default_backend() ) key_iv = kdf.derive(password.encode('utf-8')) key = key_iv[:32] iv = key_iv[32:] # AES-CBC解密 cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) decryptor = cipher.decryptor() padded_plaintext = decryptor.update(ciphertext) + decryptor.finalize() # 去除PKCS7填充 unpadder = padding.PKCS7(128).unpadder() plaintext = unpadder.update(padded_plaintext) + unpadder.finalize() return plaintext.decode('utf-8') # 替换为你加密时用的密码 PASSWORD = "your_encryption_password" encrypted_value = "U2FsdGVkX1+i0YtqcKW4tsI3witHU65dqIkgYGptHT0=" print(decrypt_aes(encrypted_value, PASSWORD))
AWS Lambda适配说明
- Lambda的Python 3.8及以上环境默认预装了cryptography库,无需额外导入层
- 如果遇到库缺失问题,可自行打包cryptography层:
- 本地执行
mkdir -p python/lib/python3.x/site-packages(替换x为Lambda用的Python版本) - 执行
pip install cryptography -t python/lib/python3.x/site-packages - 将python目录打包为zip,上传到Lambda层并关联到函数
- 本地执行
内容的提问来源于stack exchange,提问作者Reema
相关产品推荐
相关产品推荐

