我是PostgreSQL的新手。我已经阅读了教程。我可以成功地SELECT
、INSERT
、DELETE
和UPDATE
数据(我知道这只是一个基本部分)。
我现在的问题是加密数据。我现在正在找教程,但没能找到问题的答案。我在"执行任意SQL"中尝试了这段代码(编辑:在PgAdmin III?其他工具中?)。
INSERT INTO "admin" ("email_address", "password", "role_type", "status")
VALUES ('encrypt(''sdf'', digest(''secret2'', ''sha256''), ''aes'') ', 'sd', 'admin', 'Active')
但我得到的结果是这个
ERROR: function encrypt(unknown, unknown) does not exist
如何获取此函数?
到目前为止,正如我所读到的,他们只向代码展示了如何使用它
您所引用的encrypt
函数可能是捆绑的pgcrypto
扩展中的encrypt(bytea, bytea, text)
。
有关用法详细信息,请参阅上面链接的文档。
加载扩展:
CREATE EXTENSION pgcrypto;
作为超级用户。
实际上,有用的加密并不像调用encrypt
函数那么简单。你把钥匙存放在哪里?数据库服务器是否安全(如果是,为什么要加密数据)?攻击者是否可以包装或替换encrypt
函数来窃取密钥?他们能启用查询日志并从服务器日志中窃取密钥吗?触发导致记录语句的错误并从错误消息中窃取密钥?等
正确的密码学不仅仅是在代码上撒一些加密秘密酱。您需要分析您想要防御的可能攻击者,您不想尝试防御的攻击者,以及他们的能力。然后根据攻击者的假定能力和您愿意承担的成本/不便/停机时间/风险设置合适的系统。
这些函数是外部模块pgcrypto
的一部分,您必须在要使用这些函数的数据库上启用它。
安装postgresql后,运行以下命令:
psql -d <database> -f /usr/share/postgresql/<version>/contrib/pgcrypto.sql
其中<database>
是您正在使用的数据库的名称,<version>
是您安装的postgresql版本。
试试这个:
SELECT encode(encrypt('content to be encrypted', 'your_secret_key', 'aes-cbc/pad:pkcs')::bytea, 'base64');
SELECT decrypt(decode('NG0AHMsly1L7tJas/tXmOQb/Ju0iYBOrpBmR5lXmHrA=', 'base64'), 'your_secret_key', 'aes-cbc/pad:pkcs');
如果要使用查询进行加密,则必须强制转换如下列:
SELECT encode(encrypt(t.content::bytea, 'your_secret_key', 'aes-cbc/pad:pkcs')::bytea, 'base64')
from your_table t;
由接受的答案提供的命令可以在不更改我的查询或数据类型的情况下解决问题:
CREATE EXTENSION pgcrypto;
然而,重要的是要知道,在连接到要使用pgcrypto的数据库时,您需要创建扩展。要连接到数据库,请在psql中(作为超级用户):
'connect <databasename>
然后使用CREATE EXTENSION pgcrypto命令。