You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:12:18