12

我正在研究现场加密/解密。

我选择的是

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

不过,我的数据已加密,解密后另一个字符串如下所示...

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

我走错路了吗?(我知道这种询问可能很愚蠢......)

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

提前致谢...

4

2 回答 2

27

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

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

例如:

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

Postgresql 字符串函数

于 2012-09-26T09:49:41.077 回答
1

谢谢你,加里

除此之外,如果您在表查询中使用解密,则必须专门将该列强制转换为 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 解析器会因为找不到你所说的“解密”函数而对你大喊大叫。

于 2018-08-15T02:42:42.250 回答