Python中类似Jasypt的Postgres密码加密存储方案咨询
在Python中处理PostgreSQL密码加密存储(兼容Jasypt或实现类似功能)
一、直接解密Jasypt加密的密码字符串
Java中Jasypt采用对称加密算法(默认是PBEWithMD5AndDES),只要Python端使用相同的算法、密钥及加密参数,就能解密ENC(...)包裹的密文。
步骤1:安装依赖库
使用pycryptodome实现解密逻辑:
pip install pycryptodome
步骤2:解密并连接数据库
以下是适配Jasypt默认配置的解密代码,解密后直接传入psycopg2:
from Crypto.Cipher import DES from Crypto.Protocol.KDF import PBKDF2 from Crypto.Hash import MD5 from Crypto.Util.Padding import unpad import base64 import psycopg2 def decrypt_jasypt(ciphertext, encryption_key): # Jasypt默认参数:迭代次数1000,盐长度8,算法PBEWithMD5AndDES salt = ciphertext[:8] encrypted_data = ciphertext[8:] # 生成密钥和初始化向量 key_iv = PBKDF2(encryption_key, salt, dkLen=16, count=1000, hmac_hash_module=MD5) key = key_iv[:8] iv = key_iv[8:] # DES CBC模式解密 cipher = DES.new(key, DES.MODE_CBC, iv) decrypted_bytes = unpad(cipher.decrypt(base64.b64decode(encrypted_data)), DES.block_size) return decrypted_bytes.decode('utf-8') # 从配置中提取密文(去掉ENC(...)的包裹) encrypted_pwd = "udfrtIm1ypnfWTTOb29mt2IzvTTZsgwi" # 和Java Jasypt一致的加密密钥(注意密钥的安全存储) jasypt_key = "your_jasypt_secret_key" # 解密得到明文密码 plain_password = decrypt_jasypt(encrypted_pwd, jasypt_key) # 建立数据库连接 connection = psycopg2.connect( user="username", password=plain_password, host="1.6.2.1", port="5432", database="mydatabase", sslmode='require' )
二、Python中类似Jasypt的加密存储方案
如果不想手动实现解密逻辑,可以用现成库快速实现类似功能:
方案1:使用python-jasypt库(直接兼容Jasypt)
这个库专门用于和Java Jasypt交互,无需手动适配算法:
pip install python-jasypt
使用示例:
from jasypt import decrypt import psycopg2 # 解密配置中的密文 plain_password = decrypt("udfrtIm1ypnfWTTOb29mt2IzvTTZsgwi", "your_jasypt_secret_key") # 连接数据库 connection = psycopg2.connect( user="username", password=plain_password, host="1.6.2.1", port="5432", database="mydatabase", sslmode='require' )
方案2:用cryptography实现轻量对称加密
如果不需要兼容Jasypt,cryptography的Fernet模块更易用:
pip install cryptography
使用示例:
from cryptography.fernet import Fernet import psycopg2 # 生成密钥(仅需一次,妥善保存,不要存代码中) # key = Fernet.generate_key() # 从安全位置读取密钥(比如环境变量) key = b"your_fernet_secret_key" cipher = Fernet(key) # 从配置中读取密文并解密 encrypted_pwd = "gAAAAABk...(你的加密字符串)" plain_password = cipher.decrypt(encrypted_pwd.encode('utf-8')).decode('utf-8') # 连接数据库 connection = psycopg2.connect( user="username", password=plain_password, host="1.6.2.1", port="5432", database="mydatabase", sslmode='require' )
关键注意事项
- 加密密钥绝对不能存到代码或公开配置文件中,建议通过环境变量、本地安全文件或专业密钥管理服务读取。
- 若兼容Jasypt,必须保证Python端的算法、迭代次数、盐长度等参数和Java端完全一致,否则解密失败。
内容的提问来源于stack exchange,提问作者runnerpaul
相关产品推荐
相关产品推荐

