postgresql加密/解密

时间:2012-09-26 09:16:43

标签: postgresql

我正在进行字段加密/解密。

我选择的是

select encrypt('123456789012345','1234','aes');
              encrypt               
------------------------------------
 \x34591627f9c8eae417fc7cbbf458592c
(1 row)

我的数据加密了,另一个字符串在解密之后就像下面那样...

postgres=# select decrypt('\x34591627f9c8eae417fc7cbbf458592c','1234','aes');
             decrypt              
----------------------------------
 \x313233343536373839303132333435
(1 row)

我做错了吗? (我知道这种要求可能是愚蠢的......)

我要做的只是获得一种最简单的方法,加密数据的尺寸很小......

提前致谢...

2 个答案:

答案 0 :(得分:18)

decrypt函数返回一个字节字符串,而不是字符串,因此它以十六进制表示法显示。实际值相同\ x31 = 1,\ x32 = 2等。

您需要将返回值强制转换回文本。

例如:

select convert_from(decrypt('\x34591627f9c8eae417fc7cbbf458592c','1234','aes'),'SQL_ASCII');
  convert_from   
-----------------
 123456789012345
(1 row)

Postgresql string functions

答案 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解析器将对您大喊大叫,因为找不到您正在谈论的“解密”功能。