张斌金玉满堂 發表於 2025-3-10 09:47:03

PostgreSQL有效地处理数据的加密和解密的常见方法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、使用 pgcrypto 扩展</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">安装 pgcrypto 扩展</a></li><li><a href="#_lab2_0_1">对称加密(使用 AES&nbsp;算法)</a></li><li><a href="#_lab2_0_2">非对称加密(使用 RSA 算法)</a></li></ul><li><a href="#_label1">二、自定义函数实现加密解密</a></li><ul class="second_class_ul"></ul></ul></div><p>对安全级别要求较高的项目,对敏感数据都要求加密保存。</p>
<p>在 PostgreSQL 中处理数据的加密和解密可以通过多种方式实现,以确保数据的保密性和安全性。</p>
<p>我这里提供几种常见的方法。</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、使用 pgcrypto 扩展</h2>
<p>pgcrypto 是 PostgreSQL 中一个常用的扩展,用于提供加密和解密功能。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>安装 pgcrypto 扩展</h3>
<p>首先,需要确保 pgcrypto 扩展已安装。可以使用以下命令在数据库中安装:</p>
<div class="jb51code"><pre class="brush:sql;">CREATE EXTENSION pgcrypto;</pre></div>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>对称加密(使用 AES&nbsp;算法)</h3>
<p>以下是使用&nbsp;<code>pgcrypto</code>&nbsp;扩展进行对称加密(AES)的示例代码:</p>
<div class="jb51code"><pre class="brush:sql;">-- 加密
SELECT encrypt('Hello World', 'y_secret_key', 'aes');

-- 解密
SELECT decrypt(encrypt('Hello World', 'y_secret_key', 'aes'), 'y_secret_key', 'aes');</pre></div>
<p>在上述示例中,&#39;my_secret_key&#39; 是您选择的加密密钥,用于加密和解密数据。AES 算法通常提供了较好的安全性和性能平衡。</p>
<p>解释:</p>
<p>encrypt 函数接受要加密的数据、加密密钥和加密算法作为参数,并返回加密后的结果。<br />decrypt 函数接受加密后的结果、加密密钥和加密算法进行解密,并返回原始数据。</p>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>非对称加密(使用 RSA 算法)</h3>
<p>使用 pgcrypto 扩展进行非对称加密(RSA)的示例:</p>
<div class="jb51code"><pre class="brush:sql;">-- 生成 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;</pre></div>
<p>解释:</p>
<ul><li><code>gen_rsa_private_key</code>&nbsp;和&nbsp;<code>gen_rsa_public_key</code>&nbsp;函数用于生成指定长度的 RSA 密钥对。</li><li><code>encrypt_rsa</code>&nbsp;函数使用公钥对数据进行加密。</li><li><code>decrypt_rsa</code>&nbsp;函数使用私钥对加密数据进行解密。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、自定义函数实现加密解密</h2>
<p>除了使用&nbsp;<code>pgcrypto</code>&nbsp;扩展提供的函数,还可以根据业务需求自定义函数来实现更复杂的加密和解密逻辑。</p>
<p>以下是一个简单的示例,使用自定义函数进行简单的替换加密:</p>
<div class="jb51code"><pre class="brush:sql;">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;</pre></div>
<p>使用示例:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT custom_encrypt('Hello World');
SELECT custom_decrypt(custom_encrypt('Hello World'));
</pre></div>
<p>解释:</p>
<p>在上述自定义函数中,<code>custom_encrypt</code>&nbsp;函数将输入文本的每个字符的 ASCII 码值增加 1 进行加密,<code>custom_decrypt</code>&nbsp;函数将加密后的字符的 ASCII 码值减少 1 进行解密。</p>
頁: [1]
查看完整版本: PostgreSQL有效地处理数据的加密和解密的常见方法