我正在进行字段加密/解密。
我选择的是
select encrypt('123456789012345','1234','aes');
encrypt
------------------------------------
\x34591627f9c8eae417fc7cbbf458592c
(1 row)
我的数据加密了,另一个字符串在解密之后就像下面那样...
postgres=# select decrypt('\x34591627f9c8eae417fc7cbbf458592c','1234','aes');
decrypt
----------------------------------
\x313233343536373839303132333435
(1 row)
我做错了吗? (我知道这种要求可能是愚蠢的......)
我要做的只是获得一种最简单的方法,加密数据的尺寸很小......
提前致谢...
答案 0 :(得分:18)
decrypt函数返回一个字节字符串,而不是字符串,因此它以十六进制表示法显示。实际值相同\ x31 = 1,\ x32 = 2等。
您需要将返回值强制转换回文本。
例如:
select convert_from(decrypt('\x34591627f9c8eae417fc7cbbf458592c','1234','aes'),'SQL_ASCII');
convert_from
-----------------
123456789012345
(1 row)
答案 1 :(得分:0)
谢谢Gary!
此外,如果在表查询中使用解密,则必须将列专门转换为bytea类型。例如,如果您具有以下条件:
CREATE TABLE public.test_crypto
(
id bigint NOT NULL DEFAULT nextval('test_crypto_id_seq'::regclass),
plain_text text COLLATE pg_catalog."default",
crypted_text text COLLATE pg_catalog."default",
CONSTRAINT test_crypto_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
您可以像这样加密数据:
insert into public.test_crypto (plain_text, crypted_text)
values ('plaintext', encrypt('plaintext', 'salty', 'aes'))
并像这样解密它:
select id, plain_text,
convert_from(decrypt(crypted_text::bytea, 'salty', 'aes'), 'SQL_ASCII')
from test_crypto
如果您不使用crypted_text :: bytea,则SQL解析器将对您大喊大叫,因为找不到您正在谈论的“解密”功能。