Postgresql中,pgcrypto是contrib下的一个插件,它提供了一些加密函数,可以实现服务器端的数据加密。我们可以在SQL语句中调用这些函数来完成数据的加密,比如:
insert into p values(encrypt('aaaa','as','bf'),‘b’);,调用加密函数encrypt把'aaaa'加密后写入了table中。
使用pgcrypto中的加密函数,可以加密比较重要的字段,提高数据的安全性。
pgcrypto中提供了以下几种函数:
hash函数:用于计算输入数据的hash值
digest()
函数原型:
digest(data text, type text) returns bytea //hash文本类型的数据
digest(data bytea, type text) returns bytea //hash bytea类型的数据
参数:
data:要hash的数据
type: 加密算法,可取md5, sha1, sha224, sha256, sha384, sha512
例如:
postgres=# select digest('aa','sha1');
digest
--------------------------------------------
\xe0c9035898dd52fc65c41454cec9c4d2611bfb37
(1 row)
postgres=# select digest('aa'::bytea,'sha1');
digest
--------------------------------------------
\xe0c9035898dd52fc65c41454cec9c4d2611bfb37
(1 row)
可以看出,对于同一个数据,使用同样的算法时,每次hash的结果都一样。
但是请注意函数参数, 如果要对bytea hash, 那么请在输入参数时指定参数类型bytea,否则该bytea将被当作text类型的字符串。
例如以下两次调用分别调用了2个函数. 所以得到的结果也是不一样的.
postgres=# select digest('\xaa'::bytea,'sha1');
digest
--------------------------------------------
\x52538a80094f7b62948fd31e68fd17a315d8dc91
(1 row)
postgres=# select digest('\xaa','sha1');
digest
--------------------------------------------
\xadbe9dee454ef4167aff588e2a85ae3927454592
(1 row)
hmac()
函数原型:
hmac(data text, key text, type text) returns bytea //hash文本类型的数据
hmac(data bytea, key text, type text) returns bytea //hash bytea类型的数据
data:要hash的数据
type: 加密算法,可取md5, sha1, sha224, sha256, sha384, sha512
key: 秘钥
这两个函数与digest类似, 只是多了一个key参数, 也就是说同一个被加密的值, 可以使用不同的key得到不同的hash值.
这样的做法是, 不知道key的话, 也无法逆向破解原始值.
使用hmac还有一个好处是, 使用digest如果原始值和hash值同时被别人修改了是无法知道是否被修改的.
但是使用hmac, 如果原始值被修改了, 同时key没有泄漏的话, 那么hash值是无法被修改的, 因此就能够知道原始值是否被修改过.
例如:
postgres=# select hmac('aa','key1',