PostgreSQL 使用pgcrypto函数进行数据加密

2,123 阅读2分钟

概要

对数据库中的密码,个人信息之类进行加密,通常有两种方法

  • 应用端加密
  • 数据库端加密
这里讨论的是后者,PostgreSQL是通过叫做pgcrypto的加密函数进行加密的。

1. 安装pgcrypto

用超级管理员账户执行以下命令,就可以安装使用pgcrypto中的各种加密,解密函数。前提是postgreSQL 9.1之后的版本。

postgres=# CREATE EXTENSION pgcrypto;

使用\dx确认安装结果。

2. 尝试加密函数

pgcrypto支持三种加密方式。但是由于前两者并不具备PGP加密函数的先进功能,这里只介绍跟尝试使用PGP加密。

  • 普通哈希函数
  • 口令哈希函数
  • PGP 加密函数

2.1 PGP加密函数

语法

  • data-要加密的数据
  • psw- 要使用的密钥
  • options- 加密选项。很复杂,有兴趣请参考官网
    pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea
    pgp_sym_encrypt_bytea(data bytea, psw text [, options text ]) returns bytea
    

    加密例子

    密钥可以自由指定字符串文字,这里用的是pass。注意,解密时也必须指定相同的密钥。

    select pgp_sym_encrypt('mypassword','pass') as result;
    

    加密结果

    result
    C30D0407030242EC55BE12331B136DD23B013E7F43CB5FA0C1DCA5DFA43ABB51F80128FD536B03C9CF6C5D7193C2F72B9D379E4EDB92155D129564596BE39B5059695D00B6B4F1D873CF41DB
    

    3.1 PGP解密函数

    语法

  • data-要解密的数据
  • psw- 要使用的密钥
  • options- 解密选项。很复杂,有兴趣请参考官网
    pgp_sym_decrypt(msg bytea, psw text [, options text ]) 返回 text
    pgp_sym_decrypt_bytea(msg bytea, psw text [, options text ]) returns bytea
    

    解密例子

    解密时也必须指定加密的密钥。

    select pgp_sym_decrypt(pgp_sym_encrypt('mypassword','pass'), 'pass') as result;
    

    解密结果

    result
    mypassword
    

    如果使用错误的密钥,当然会解密失败。

    select pgp_sym_decrypt(pgp_sym_encrypt('mypassword','pass'), 'wrongpass') as result;
    

    总结

    使用pgcrypto的PGP函数可以轻松的进行数据加密,解密。不过即使加密了数据库中的数据,解密后在网络传输中也时毫无保护的,还需要跟SSL等配合使用。