我正在使用 Ubuntu Server 10.10 并且我已经使用apt-get install postgresql. 我想使用内置sha1()功能,但似乎必须先安装pgcrypto。但我不知道如何安装它。
没有pgcrypto,如果我尝试使用安装它apt-get install pgcrypto,我不找到以任何文件pgcrypto在我的系统(我想find / -name "pgcrypto*")。
如何安装 pgcrypto 以便我可以digest('word-to-hash','sha1')在我的数据库查询中使用该函数?
更新:我正在努力在另一台 Ubuntu 机器上安装 pgcrypto。使用sudo apt-get install postgresql-contrib-8.4如何将软件包安装到我当前的 PostgreSQL 数据库后安装软件包?
SELECT gen_random_uuid()
产生输出
ERROR: function gen_random_uuid() does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
我CREATE EXTENSION pgcrypto;在选定的数据库上运行并SELECT gen_random_bytes(1)完美运行(gen_random_bytes不适用于pgcrypto未手动创建扩展的其他数据库)。
% psql --version
psql (PostgreSQL) 9.5.3
Run Code Online (Sandbox Code Playgroud)
Ubuntu 版本是 16.04。
我想知道是否有任何方法可以在 PostgreSQL 中执行以下操作:
UPDATE cryptotable SET work = work + 'some big hexadecimal number'
Run Code Online (Sandbox Code Playgroud)
其中 work 是一个无符号的 256 位数字。现在我的列是一个字符变化(64)列(十六进制表示),但如果它让我执行上述操作,我很乐意切换到另一种数据类型。
如果 vanilla PostgreSQL 无法实现,是否有可以帮助我的扩展?
(我也将此发布到 pgsql-hackers,因此请查看那里的线程以获取更多想法。)
在 AWS RDS 实例上,我们运行了
CREATE EXTENSION pgcrypto;
Run Code Online (Sandbox Code Playgroud)
扩展已创建。两个查询:
SELECT digest('a', 'sha256') FROM table_name;
SELECT public.digest('a', 'sha256') FROM table_name;
Run Code Online (Sandbox Code Playgroud)
给出错误函数 public.digest(unknown,unknown) 不存在
我crypt()在我的一个函数中使用了哈希用户密码。但是我在第二天启动我的电脑时观察到,同样的事情失败了,因为密码功能在重新启动时变得不可用。它显示消息,如功能gen_salt()/crypt()未知或未定义。我执行了create extension pgcrypto;一次,它开始工作。
如何在生产环境中处理这个?即使 db 重新启动,有没有办法使该模块在 db 中永久可用?
或者我是否必须指示服务器管理器运行此命令以防他们需要重新启动数据库服务器?
或者我可以在函数本身中编写此语句,以便每次使用加密函数之前都会创建扩展?
此外,我们正在使用 db 的读取副本,它不允许执行此“创建扩展”语句,因为只有读取权限。那么如何在这样的只读环境中使用这种加密功能呢?
postgresql pgcrypto read-only-database postgresql-extensions