数据库 PGP 加密算法、mode、PAD的选择
来源:互联网 发布:ios10降9.3健康无数据 编辑:程序博客网 时间:2024/06/08 09:05
标签
PostgreSQL , Greenplum , crypt , pgcrypt , mode , padding , 算法 , aes , bf , cbc , ecb , openssl , enc , linux
背景
PostgreSQL, Greenplum的数据加密插件pgcrypto,用于加密数据。
其中用于PGP对称加密的函数例子:
Introduction of PGP encryption, usage of raw encryption functions is discouraged.
encrypt(data bytea, key bytea, type text) returns bytea decrypt(data bytea, key bytea, type text) returns bytea encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
Encrypt/decrypt data using the cipher method specified by type.
The syntax of the type string is:
algorithm [ - mode ] [ /pad: padding ]
where algorithm is one of:
bf — Blowfish aes — AES (Rijndael-128)
and mode is one of:
cbc — next block depends on previous (default) ecb — each block is encrypted separately (for testing only)
and padding is one of:
pkcs — data may be any length (default) none — data must be multiple of cipher block size
So, for example, these are equivalent:
encrypt(data, 'fooz', 'bf') encrypt(data, 'fooz', 'bf-cbc/pad:pkcs')
In encrypt_iv and decrypt_iv, the iv parameter is the initial value for the CBC mode;
it is ignored for ECB.
It is clipped or padded with zeroes if not exactly block size.
It defaults to all zeroes in the functions without this parameter.
注意,在实际使用时,通常不需要写mode和pad方法。这样就带来了一定的差异。
例如Oracle, MySQL默认的mode是ecb,并不安全。
PostgreSQL默认的mode是cbc,更加安全。
我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。
AES
aes是基于数据块的加密方式,也就是说,每次处理的数据时一块(16字节),当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度
分组加密的几种模式:
ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。这是PostgreSQL pgcrypto的默认MODE。
CFB/OFB:实际上是一种反馈模式,目的也是增强破解的难度。
FCB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化向量。
mode不一样导致加密结果不一样的例子
选择不一样的mode,对同一串字符加密,得到的加密结果是不一样的
1、mode=cbc
postgres=# SELECT UPPER(ENCODE(ENCRYPT(DECODE('6999217001930000722099991','escape'),'DATAENCRYPTIONYH'::bytea,'aes'::text),'hex'))::text ; upper ------------------------------------------------------------------ BE298AD86D3ADA917C5831A1EA7C856761B0FA22F618928BA56FC4D1C972E402 (1 row) postgres=# SELECT UPPER(ENCODE(ENCRYPT(DECODE('6999217001930000722099991','escape'),'DATAENCRYPTIONYH'::bytea,'aes-cbc'::text),'hex'))::text ; upper ------------------------------------------------------------------ BE298AD86D3ADA917C5831A1EA7C856761B0FA22F618928BA56FC4D1C972E402 (1 row)
2、mode=ecb
postgres=# SELECT UPPER(ENCODE(ENCRYPT(DECODE('6999217001930000722099991','escape'),'DATAENCRYPTIONYH'::bytea,'aes-ecb'::text),'hex'))::text ; upper ------------------------------------------------------------------ BE298AD86D3ADA917C5831A1EA7C8567EB01669E109F443A90D7EEABA3343E3A (1 row)
解密时,如果使用ecb加密的串,用cbc来解密,显然得到的结果是不对的,反之亦然
postgres=# select encode(decrypt(ENCRYPT(DECODE('6999217001930000722099991','escape'),'DATAENCRYPTIONYH'::bytea,'aes-ecb'::text), 'DATAENCRYPTIONYH'::bytea, 'aes-ecb'), 'escape'); encode --------------------------- 6999217001930000722099991 (1 row) postgres=# select encode(decrypt(ENCRYPT(DECODE('6999217001930000722099991','escape'),'DATAENCRYPTIONYH'::bytea,'aes-cbc'::text), 'DATAENCRYPTIONYH'::bytea, 'aes-cbc'), 'escape'); encode --------------------------- 6999217001930000722099991 (1 row) postgres=# select encode(decrypt(ENCRYPT(DECODE('6999217001930000722099991','escape'),'DATAENCRYPTIONYH'::bytea,'aes-ecb'::text), 'DATAENCRYPTIONYH'::bytea, 'aes-cbc'), 'escape'); encode ---------------------------------------------------------------- 6999217001930000\211\x1B\270\350T\x03\343\250M_6\246\355{\202` (1 row)
小结
如果你发现同样用到了AES算法加密,但是得到的加密串不一样,那么请注意两者用的mode, padding是否一致,如果不一致,结果肯定是不一样的。
解密与加密的算法、MODE、PADDING都需要一样,才能保证正常的解密。
如果你的ORACLE或MYSQL用了ecb mode,那么在PostgreSQL, Greenplum中解密时,请务必使用同样的mode来解密。
原文链接
- 数据库 PGP 加密算法、mode、PAD的选择
- 加密算法介绍及加密算法的选择
- 加密算法介绍及加密算法的选择
- 加密算法介绍及加密算法的选择
- PGP 加密算法在安全电子邮件中的应用
- 我的PGP公钥
- 我的PGP公钥
- wiki的PGP
- PGP
- 加密软件PGP的使用
- BlueJ的code pad
- Tensorflow的pad
- Java 与数据库相同的md5加密算法
- 善用PGP加密工具的七大法宝
- 加密程序PGP背后的故事
- 加密程序PGP背后的故事
- 使用PGP加密你的文件
- ceph pg和pgp的区别
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- Hiredis
- 第三章 Python丰富的数据类型
- 响应状态status为canceled,解决办法
- 第二章 字符串处理与编码不再发愁
- 数据库 PGP 加密算法、mode、PAD的选择
- Winform下的地图开发控件(GMap.NET)使用心得转载学习
- 好东西来了!2017云栖大会400+份重磅资料下载
- 测试 MD 编辑器
- 每天一道LeetCode-----化简路径
- 如何选择开源项目?
- 透透彻彻IoC(你没有理由不懂!)
- openGL 导入deep Exploration 3d模型
- 11月28日云栖精选夜读:阿里巴巴正式开源其自研容器技术Pouch