在数据库连接字符串中加密密码是一种常见的安全实践,可以防止未经授权的访问。以下是一些常见的方法来加密数据库连接字符串中的密码:
将密码存储在环境变量中,而不是直接写在连接字符串中。这样可以避免将敏感信息硬编码在代码库中。
# 在Linux/MacOS中设置环境变量
export DB_PASSWORD="your_password"
# 在Windows中设置环境变量
set DB_PASSWORD=your_password
然后在代码中读取环境变量:
import os
db_password = os.getenv('DB_PASSWORD')
使用配置管理工具(如Ansible、Terraform、HashiCorp Vault等)来管理和加密敏感信息。
安装和配置Vault:
vault server -dev
写入密码:
vault kv put secret/db your_password=your_password
读取密码:
import hvac
client = hvac.Client(url='http://127.0.0.1:8200')
client.token = 'your_initial_token' # 获取初始token
secret = client.secrets.kv.v2.read_secret_version(path='secret/db')
db_password = secret['data']['data']['your_password']
使用加密库(如PyCryptodome、cryptography等)来加密和解密密码。
安装库:
pip install pycryptodome
加密密码:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64
key = get_random_bytes(16) # 16字节密钥
cipher = AES.new(key, AES.MODE_CBC)
ct_bytes = cipher.encrypt(pad(b"your_password", AES.block_size))
iv = base64.b64encode(cipher.iv).decode('utf-8')
ct = base64.b64encode(ct_bytes).decode('utf-8')
encrypted_password = f"{iv}:{ct}"
解密密码:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64
key = get_random_bytes(16) # 16字节密钥
iv, ct = encrypted_password.split(':')
iv = base64.b64decode(iv)
ct = base64.b64decode(ct)
cipher = AES.new(key, AES.MODE_CBC, iv)
pt = unpad(cipher.decrypt(ct), AES.block_size)
db_password = pt.decode('utf-8')
某些数据库(如PostgreSQL、MySQL)提供了内置的加密功能,可以直接在数据库中加密存储密码。
CREATE EXTENSION IF NOT EXISTS pgcrypto;
INSERT INTO users (username, password) VALUES ('your_username', crypt('your_password', gen_salt('bf')));
然后在连接字符串中使用加密后的密码:
import psycopg2
conn = psycopg2.connect(
dbname="your_dbname",
user="your_username",
password="encrypted_password",
host="your_host",
port="your_port"
)
选择哪种方法取决于你的具体需求和环境。通常,结合使用环境变量和加密库是最常见和推荐的做法,因为它提供了良好的安全性和灵活性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。