Postgresql数据加密函数介绍

业务需求需要对一些敏感数据进行加密处理,说到加密,分为非对称加密和对称加密,稍微解释一下这两个名词
1.对称加密方法,指加密和解密使用同一把密钥的方法。优势是加密速度快,缺陷是密钥只有一把,安全性较低。


2.非对称加密方法,指加密和解密用到一对钥匙,一把为私钥,一把为公钥。通常的用法是公钥用于加密,私钥用于解密,当然也可以私钥加密,公钥解密。比如乙方用公钥进行加密后,发送数据到甲方,甲方用自己的私有密钥解密,就算传输过程中,数据被截取,甚至公钥被拿到,没有私钥,还是无法解密,这种加密的优势是更加安全,你自己只要保护好私钥,就可以保证别人给你发的数据无法被篡改、窃听。这种加密方式的效率和对称加密相比,效率会差。



oracle数据库加密有透明数据加密,这个是从10g就有了,需要了解可以转到下面链接
https://docs.oracle.com/cd/B19306_01/network.102/b14268/asotrans.htm#ASOAG600


下面介绍一下postgresql服务端加密插件pgcrypto

1.安装插件
create extension pgcrypto;
2.加密函数实例
一般哈希加密函数
digest()函数
digest(data text, type text) returns bytea
digest(data bytea, type text) returns bytea

标准算法支持md5, sha1, sha224, sha256, sha384 and sha512,如果编译时有OpenSSL选项,那么会有更多的算法支持,见下表

FunctionalityBuilt-inWith OpenSSL
MD5yesyes
SHA1yesyes
SHA224/256/384/512yesyes (Note 1)
Other digest algorithmsnoyes (Note 2)
Blowfishyesyes
AESyesyes (Note 3)
DES/3DES/CAST5noyes
Raw encryptionyesyes
PGP Symmetric encryptionyesyes
PGP Public-Key encryptionyesyes

举例:
可以使用不同的加密算法
hank=# select digest('I like the girl who is pretty', 'md5');
               digest               
------------------------------------
 \x9ce35f7b9938e4416fece04ed4638cab


hank=# select digest('I like the girl who is pretty', 'sha1');
                   digest                   
--------------------------------------------
 \xb8995c8638cb995d15b8b99a7597c6fd75436770
(1 row)


hank=# select digest('I like the girl who is pretty', 'sha224');
                           digest                           
------------------------------------------------------------
 \x9c18ee740b10abff52c7b4acb1caec46b294f12bc9a9bdb7916a4a27
如果想要摘除十六进制标识,可以使用encode,如下结果中就没有\x了
 
hank=# select encode(digest('I like the girl who is pretty', 'md5'),'hex');
              encode              
----------------------------------
 9ce35f7b9938e4416fece04ed4638cab
hmac()函数
hmac(data text, key text, type text) returns bytea
hmac(data bytea, key text, type text) returns bytea
用key计算hash值,type和digest一样,hmac和digest类似,但是只有早知道key的情况下才能计算出哈希值,
这样可以预防更改数据以及更改哈希匹配的情况,如果key大于hash block size,那么先计算哈希值,哈希值作为key使用
举例:
hank=#  select hmac('I like the girl who is pretty', 'this is a key','md5');
                hmac                
------------------------------------
 \x0e5e3d552c2fc9b24761d1e1efc78d93
(1 row)


hank=#  select hmac('I like the girl who is pretty', 'this is a key','sha1');
                    hmac                    
--------------------------------------------
 \xb4f5c456bb142ff608d1d40f1563ec6dbdb6a7f9
(1 row)


hank=#  select hmac('I like the girl who is pretty', 'this is a key','sha256');
                                hmac                                
--------------------------------------------------------------------
 \x3f3a9c8b367f84facc3899187ba60f00daf0d5d0d768b6526ac3d545b330959d




摘除十六进制标识
 
hank=#  select encode(hmac('I like the girl who is pretty', 'this is a key','sha1'),'hex');       
                  encode                  
------------------------------------------
 b4f5c456bb142ff608d1d40f1563ec6dbdb6a7f9

密码哈希函数
crypt()和gen_salt()专用于密码哈希加密,crypt()计算哈希值, gen_salt()为crypt()提供算法参数,gen_salt()是随机产生一个值并传递给crypt()使用
在以下几个方面,crypt()与MD5,sha1的哈希算法不同
1.crypt()加密算法比较慢,因为数据量很小,这就是使得暴力破解密码比较难的一种方法。换句话说,就是说使用crypt()加密,比较安全,很难用暴力破解密码。
2. gen_salt()产生随机值,因此即使密码一样,加密后的密码也会不一样。
3.在结果中包含了算法类型,因此不同算法的哈希密码可以共存

4.其中一些是自适应的,意味着,当计算机变得更快时,你可以调整该算法变得更慢,而不会产生与现有口令的不兼容。crypt(password text, salt text) returns text

gen_salt(type text [, iter_count integer ]) returns text

crypt支持的算法

AlgorithmMax Password LengthAdaptive?Salt BitsOutput LengthDescription
bf72yes12860Blowfish-based, variant 2a
md5unlimitedno4834MD5-based crypt
xdes8yes2420Extended DES
des8no1213Original UNIX crypt

crypt()迭代次数

AlgorithmDefaultMinMax
xdes725116777215
bf6431

xdes额外限制,只能是奇数

bf最小是4,最大31,一定要注意

假设密码由大小写字母以及数字组成,8个字符密码所有字符组合所需要的时间

哈希算法速度

AlgorithmHashes/secFor [a-z]For [A-Za-z0-9]Duration relative to md5 hash
crypt-bf/817924 years3927 years100k
crypt-bf/736482 years1929 years50k
crypt-bf/671681 year982 years25k
crypt-bf/513504188 days521 years12.5k
crypt-md517158415 days41 years1k
crypt-des23221568157.5 minutes108 days7
sha13777427290 minutes68 days4
md5 (hash)15008550422.5 minutes17 days1

实例:

hank=# select crypt('this is my password', gen_salt('xdes',4));  
ERROR:  gen_salt: Incorrect number of rounds
hank=# select crypt('this is my password', gen_salt('xdes',5));
        crypt         
----------------------
 _3...btBSoVwmTmPniTs

 hank=# select crypt('this is my password', gen_salt('md5'));   
               crypt                
------------------------------------
 $1$foh3.pi4$RhO.ftFCiVT3aCiJYy.U6/

 hank=# select crypt('this is my password', gen_salt('md5'));
               crypt                
------------------------------------
 $1$2PG7y.ZR$nDITGLovK2qK3ETHApL2I0


 hank=# select crypt('this is my password', gen_salt('bf',4));
                            crypt                             
--------------------------------------------------------------
 $2a$04$Asyqp8HL/3pfj.AsnZN00.zFjWrS6RHqtpsz6P57SXUv2hfi/R2zG

建表测试:

create table t_pwd(id int primary key, pwd text);


 insert into  t_pwd(id,pwd) values (1, crypt('this is a pwd', gen_salt('bf',8)));

hank=# select * from t_pwd;
 id |                             pwd                              
----+--------------------------------------------------------------
  1 | $2a$08$Zw.beTeVnu8e2P3q9cZs5OImLhYYe4IICS7Lgf4GlDcdF9A9bTbO6
(1 row)

解密测试:
hank=# select * from t_pwd where pwd=crypt('this is a pwd',pwd);
 id |                             pwd                              
----+--------------------------------------------------------------
  1 | $2a$08$Zw.beTeVnu8e2P3q9cZs5OImLhYYe4IICS7Lgf4GlDcdF9A9bTbO6
(1 row)

hank=# select * from t_pwd where pwd=crypt('this',pwd);         
 id | pwd 
----+-----
(0 rows)


以下测试可见,空格一定不要忽略掉,否则也是返回false
hank=# select crypt('this is a error pwd source', pwd)=pwd from t_pwd where id =1;                    
 ?column? 
----------
 f
(1 row)

hank=# select crypt('this is a  pwd ', pwd)=pwd from t_pwd where id =1;           
 ?column? 
----------
 f
(1 row)

hank=# select crypt('this is a pwd', pwd)=pwd from t_pwd where id =1;  
 ?column? 
----------
 t
(1 row)




























  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是一种开源的关系型数据库管理系统(RDBMS),它具有可扩展性、稳定性和安全性等特点。下面是对PostgreSQL数据库的介绍: 1. 数据模型:PostgreSQL采用了关系型数据模型,数据以表格的形式进行组织和存储。每个表格由多个列和行组成,列定义了表格中的属性,行则表示具体的数据记录。 2. 扩展性:PostgreSQL支持水平和垂直两种方式的扩展。水平扩展通过添加更多的服务器节点来增加系统的处理能力,而垂直扩展则通过增加更多的硬件资源(如CPU、内存)来提升单个节点的性能。 3. ACID事务:PostgreSQL支持ACID(原子性、一致性、隔离性和持久性)事务,确保数据库操作的可靠性和一致性。它使用多版本并发控制(MVCC)来实现高并发的事务处理。 4. 多种数据类型:除了常见的整数、浮点数和字符串等基本数据类型外,PostgreSQL还支持复杂数据类型,如数组、JSON、XML等。这使得它可以更好地适应各种应用场景。 5. 安全性:PostgreSQL提供了强大的安全功能,包括用户认证、访问控制和数据加密等。它支持基于角色的访问控制(RBAC),可以细粒度地管理用户对数据库对象的权限。 6. 扩展性:PostgreSQL提供了丰富的扩展接口和插件机制,可以通过编写自定义插件来扩展数据库的功能。这使得开发人员可以根据自己的需求添加新的数据类型、函数和操作符等。 7. 兼容性:PostgreSQL兼容SQL标准,并提供了许多扩展功能,如全文搜索、地理空间数据处理和时间序列数据处理等。此外,它还支持多种编程语言的接口,如Java、Python和C++等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值