AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 263850
Accepted
cjones
cjones
Asked: 2020-03-29 13:24:49 +0800 CST2020-03-29 13:24:49 +0800 CST 2020-03-29 13:24:49 +0800 CST

将 MySQL AES_DECRYPT() 转换为 Postgres 解密()

  • 772

我使用以下 MySQL 查询AES_DECRYPT():

SELECT * 
FROM data_tbl
WHERE AES_DECRYPT(data_point,'aBcDeF')='data_1';

我已经发现 Postgres 11 中的等价物是decrypt()(F.25.4. Raw Encryption Functions),查询看起来像这样:

SELECT * 
FROM data_tbl
AND decrypt(data_point,'aBcDeF','aes')='data_1';

至少,两者的文档让我相信它们是等价的。

数据从 MySQL 转储并导入 PostgreSQL。

  • MySQL 中的data-point字段是类型varbinary(255),值都显示BLOB在 MySQL Workbench 中。
  • Postgres 中的data_point字段是类型bytea,值都显示[binary data]在 pgAdmin 中。

我承认,我不确定这些数据类型是否等效。

MySQL 查询工作并根据他的条件查找记录。PostgreSQL 没有,尽管记录在那里。所以它似乎是三件事之一:

  1. 数据类型 ( varbinary(255)vs bytea) 不等价
  2. 数据不匹配 ( BLOBvs [binary data]) 不等价
  3. 函数 ( AES_DECRYPTvs decrypt()) 不等价

我确实尝试通过首先尝试解密 PostgreSQL 中的值,以查看它的可读格式:

SELECT decrypt(data_point, 'aBcDeF', 'aes') 
FROM data_tbl;

但这只是[binary data]为所有行返回。

然后我遇到了这个答案,使用convert_from如下:

SELECT convert_from(decrypt(data_point, 'aBcDeF', 'aes'), 'SQL_ASCII')
FROM data_tbl;

但是,我只是收到此错误:

ERROR:  invalid byte sequence for encoding "UTF8": 0xcf 0xf5
SQL state: 22021

所以在这一点上,我对如何解决主要问题感到困惑。主要问题是在 PostgreSQL 11 中进行等效AES_DECRYPT操作。最后一条错误消息不是什么大问题,但它可能与decrypt()不返回相同的结果有关。

有什么建议么?

mysql postgresql
  • 2 2 个回答
  • 1601 Views

2 个回答

  • Voted
  1. World Wide DBA
    2020-03-29T14:03:03+08:002020-03-29T14:03:03+08:00

    实际上,我怀疑您的所有三个假设都是正确的,并且都在您无法解密数据的原因中发挥了作用。我将尝试解释一下。

    加密和解密中最重要的因素之一是二进制兼容性——更准确地说,每个数据库如何物理存储数据?数据是大端还是小端存储,内部数据结构是如何实现的(VARBINARY和之间的二进制区别BYTEA是什么),每个系统上使用的字符集和编码是什么?加密是位敏感的,因此位/字节顺序的任何变化都会影响任何加密或解密的结果。

    此外,即使两个系统都可以使用 AES,它们的默认设置也略有不同。在 MySQL 上,AES 的默认值是使用 ECB 模式的 128 位密钥;而在 PostgreSQL 上,默认是使用 CBC 模式加密数据的 128 位密钥。您将需要确保用于加密/解密的所有选项都是相同的(即使您尝试在同一系统中对其进行解密)。

    从逻辑上讲,如果两个系统之间的一切都相同,您应该能够解密数据。在实践中,它会比这更难,如果你可以访问源系统,在那里解密,导出数据,然后在 PostgreSQL 中导入和加密它。

    • 2
  2. Best Answer
    Daniel Vérité
    2020-03-30T05:46:16+08:002020-03-30T05:46:16+08:00

    是的,您似乎可以将 pgcryptodecrypt与用 mysql 加密的值一起使用aes_encrypt。

    例子:

    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 8.0.19    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> select aes_encrypt(unhex('AA'), unhex('BB'));
    +------------------------------------------------------------------------------+
    | aes_encrypt(unhex('AA'), unhex('BB'))                                        |
    +------------------------------------------------------------------------------+
    | 0xB10FF3B381FFA2025B603CEFCB04590A                                           |
    +------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    在 PostgreSQL 中:

    test=> select version();
                                                                  version                                                              
    -----------------------------------------------------------------------------------------------------------------------------------
     PostgreSQL 11.7 (Ubuntu 11.7-2.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit
    (1 row)
    
    
    test=> \dx pgcrypto 
                 List of installed extensions
       Name   | Version | Schema |       Description       
    ----------+---------+--------+-------------------------
     pgcrypto | 1.3     | public | cryptographic functions
    (1 row)
    
    test=> select decrypt('\xB10FF3B381FFA2025B603CEFCB04590A'::bytea, '\xbb'::bytea, 'aes');
     decrypt 
    ---------
     \xaa
    (1 row)
    

    至于您提到的查看数据的麻烦:

    • pgAdmin 只显示类型内容的 [二进制数据] bytea。

    • 如果使用命令行工具psql,它将显示内容的十六进制表示(实际上取决于bytea_output参数,但默认为十六进制)。

    • 否则,SQL 函数encode可以做到这一点:

      test=> select encode('foobar'::bytea, 'hex');
          encode    
      --------------
       666f6f626172
      
    • 如果初始(预加密)内容表示一段经过有效编码的文本,请使用convert_from(binary_string, encoding)正确的编码。远离SQL_ASCII:它是一种不代表任何特定编码的伪编码,并且是一种很少有合法用例的hack。

      test=> select convert_from('\x666f6f626172'::bytea, 'UTF-8');
       convert_from 
      --------------
       foobar
      (1 row)
      

    就您个人而言,我首先要做的是在解密之前比较 PostgreSQL 和 MySQL 中出现问题的数据行的内容,以验证导出/导入过程。如果它们不匹配,当然它们不会解密为相同的值。

    • 1

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve