数据库 PGP 加密算法、mode、PAD的选择 - PG与Oracle, MySQL的差异(安全性)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介:

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

标签

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来解密。

参考

https://www.postgresql.org/docs/10/static/pgcrypto.html

《PostgreSQL 和 Greenplum pgcrypto 加解密bytea处理差异》

《固若金汤 - PostgreSQL pgcrypto加密插件》

《PostgreSQL 如何实现网络压缩传输或加密传输(openssl)》

man openssl

man enc

        aes-[128|192|256]-cbc  128/192/256 bit AES in CBC mode  
        aes-[128|192|256]      Alias for aes-[128|192|256]-cbc  
        aes-[128|192|256]-cfb  128/192/256 bit AES in 128 bit CFB mode  
        aes-[128|192|256]-cfb1 128/192/256 bit AES in 1 bit CFB mode  
        aes-[128|192|256]-cfb8 128/192/256 bit AES in 8 bit CFB mode  
        aes-[128|192|256]-ecb  128/192/256 bit AES in ECB mode  
        aes-[128|192|256]-ofb  128/192/256 bit AES in OFB mode  
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
13 0
|
4天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(上)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
20 0
|
4天前
|
SQL Oracle 安全
Oracle11g更改数据库名(详细教程)
Oracle11g更改数据库名(详细教程)
14 1
|
1天前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错合集之采集oracle的时候报ORA-65040:不允许从可插入数据库内部执行该操作如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
16 3
|
2天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之可以通过配置Oracle数据库的schema注册表来监测表结构的变化吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
10 1
|
2天前
|
关系型数据库 MySQL API
实时计算 Flink版产品使用合集之可以通过mysql-cdc动态监听MySQL数据库的数据变动吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
16 0
|
3天前
|
Java 关系型数据库 MySQL
MySql数据库级别MD5加密java MD5加密解密工具包
MySql数据库级别MD5加密java MD5加密解密工具包
|
4天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
26 0
|
4天前
|
Oracle 关系型数据库 数据库
Oracle数据库协议适配器错误解决方法
Oracle数据库协议适配器错误解决方法
9 2
|
4天前
|
存储 Oracle 关系型数据库
实验三 Oracle数据库的创建和管理
实验三 Oracle数据库的创建和管理
14 1

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多
    http://www.vxiaotou.com