头图

PostgreSQL


对安全级别要求较高的项目,对敏感数据都要求加密保存。

在 PostgreSQL 中处理数据的加密和解密可以通过多种方式实现,以确保数据的保密性和安全性。

我这里提供几种常见的方法。

一、使用 pgcrypto 扩展

pgcrypto 是 PostgreSQL 中一个常用的扩展,用于提供加密和解密功能。

安装 pgcrypto 扩展

首先,需要确保 pgcrypto 扩展已安装。可以使用以下命令在数据库中安装:

CREATE EXTENSION pgcrypto;

对称加密(使用 AES 算法)

以下是使用 pgcrypto 扩展进行对称加密(AES)的示例代码:

-- 加密
SELECT encrypt('Hello World', 'y_secret_key', 'aes');

-- 解密
SELECT decrypt(encrypt('Hello World', 'y_secret_key', 'aes'), 'y_secret_key', 'aes');

在上述示例中,'my_secret_key' 是您选择的加密密钥,用于加密和解密数据。AES 算法通常提供了较好的安全性和性能平衡。

解释:

  • encrypt 函数接受要加密的数据、加密密钥和加密算法作为参数,并返回加密后的结果。
  • decrypt 函数接受加密后的结果、加密密钥和加密算法进行解密,并返回原始数据。

非对称加密(使用 RSA 算法)

使用 pgcrypto 扩展进行非对称加密(RSA)的示例:

-- 生成 RSA 密钥对
SELECT gen_rsa_private_key(2048) AS private_key, gen_rsa_public_key(2048) AS public_key;

-- 加密
SELECT encrypt_rsa('Hello World', public_key) AS encrypted_data 
FROM (SELECT gen_rsa_public_key(2048) AS public_key) t;

-- 解密
SELECT decrypt_rsa(encrypted_data, private_key) AS decrypted_data
FROM (
    SELECT 
        encrypt_rsa('Hello World', gen_rsa_public_key(2048)) AS encrypted_data,
        gen_rsa_private_key(2048) AS private_key
) t;

解释:

  • gen_rsa_private_keygen_rsa_public_key 函数用于生成指定长度的 RSA 密钥对。
  • encrypt_rsa 函数使用公钥对数据进行加密。
  • decrypt_rsa 函数使用私钥对加密数据进行解密。

二、自定义函数实现加密解密

除了使用 pgcrypto 扩展提供的函数,还可以根据业务需求自定义函数来实现更复杂的加密和解密逻辑。

以下是一个简单的示例,使用自定义函数进行简单的替换加密:

CREATE OR REPLACE FUNCTION custom_encrypt(text_to_encrypt text)
RETURNS text AS $$
DECLARE
    encrypted_text text := '';
    char_code integer;
BEGIN
    FOR i IN 1..length(text_to_encrypt) LOOP
        char_code := ascii(substring(text_to_encrypt, i, 1)) + 1;
        encrypted_text := encrypted_text || chr(char_code);
    END LOOP;
    RETURN encrypted_text;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION custom_decrypt(encrypted_text text)
RETURNS text AS $$
DECLARE
    decrypted_text text := '';
    char_code integer;
BEGIN
    FOR i IN 1..length(encrypted_text) LOOP
        char_code := ascii(substring(encrypted_text, i, 1)) - 1;
        decrypted_text := decrypted_text || chr(char_code);
    END LOOP;
    RETURN decrypted_text;
END;
$$ LANGUAGE plpgsql;

使用示例:

SELECT custom_encrypt('Hello World');
SELECT custom_decrypt(custom_encrypt('Hello World'));

解释:
在上述自定义函数中,custom_encrypt 函数将输入文本的每个字符的 ASCII 码值增加 1 进行加密,custom_decrypt 函数将加密后的字符的 ASCII 码值减少 1 进行解密。

三、处理加密数据的最佳实践

1. 密钥管理

  • 密钥应妥善保管,避免泄露。
  • 定期更换密钥以增强安全性。

2. 数据备份和恢复

  • 在备份加密数据时,确保备份中包含了必要的密钥或能够在恢复时获取有效的密钥。
  • 测试恢复流程以确保加密数据可以正确恢复。

3. 性能考虑

  • 加密和解密操作可能会对数据库性能产生影响,特别是在处理大量数据时。需要进行性能测试和优化。
  • 选择合适的加密算法和密钥长度,平衡安全性和性能需求。

4. 访问控制

  • 严格限制对加密密钥和加密数据的访问权限,只授予必要的人员和角色。

四、结合应用层面的加密

有时,仅仅在数据库层面进行加密可能不够,还需要在应用程序层面进行额外的加密处理。例如,在将数据发送到数据库之前在应用程序中进行加密,或者在从数据库获取数据后在应用程序中进行解密。

以下是一个使用 Python 结合 PostgreSQL 进行数据加密和解密的示例:

import psycopg2
from cryptography.fernet import Fernet

# 生成加密密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# 连接数据库
conn = psycopg2.connect(database="your_database", user="your_user", password="your_password", host="your_host")
cursor = conn.cursor()

def encrypt_data(data):
    return cipher_suite.encrypt(data.encode()).decode()

def decrypt_data(encrypted_data):
    return cipher_suite.decrypt(encrypted_data.encode()).decode()

# 插入加密数据
encrypted_data = encrypt_data('Hello World')
cursor.execute("INSERT INTO your_table (encrypted_column) VALUES (%s)", (encrypted_data,))
conn.commit()

# 获取并解密数据
cursor.execute("SELECT encrypted_column FROM your_table")
row = cursor.fetchone()
decrypted_data = decrypt_data(row[0])
print(decrypted_data)

cursor.close()
conn.close()

解释:
在这个示例中,我们首先使用 cryptography 库的 Fernet 模块生成加密密钥。然后,定义了 encrypt_datadecrypt_data 函数在 Python 中进行加密和解密操作。在与 PostgreSQL 数据库的交互中,先对数据进行加密后插入,再获取加密数据并在 Python 中进行解密。

PostgreSQL 中有效地处理数据加密和解密需要根据具体的业务需求和安全要求选择合适的方法和策略。同时,要重视密钥管理、性能优化和访问控制等方面,以确保数据的安全性和可用性。

整体看因加密存储,多出了不少额外工作,还是要根据实际场景做好规划。


美丽的分割线

🎉相关推荐

PostgreSQL


墨松
484 声望570 粉丝

认清生活的真相后依然热爱生活 !