【问题标题】:Encrypted Data to Decimal加密数据到十进制
【发布时间】:2020-01-21 07:10:58
【问题描述】:
SELECT AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134'));

如何将上面的加密数据转换为存储在 DECIMAL(15,2) 列中?

【问题讨论】:

  • 任何可以存储在上述列类型中的整数或小数的加密函数建议。
  • 您对单向加密功能感兴趣吗(一旦加密,就无法解密得到原始值)?
  • 有什么办法,也可以解密
  • 我有一些工作,但它是DECIMAL(65);原因是 AES 加密确实使用多字节字符转换为二进制字符串。检查:db-fiddle.com/f/oYnrx5jkAnSqNCqzYL26qW/1如果它适合你,我会想出反向解密的方法。

标签: mysql encryption decimal


【解决方案1】:

知道值(例如12.21总是适合DECIMAL(15,2)吗?

如果是这样,我看不出问题出在哪里。

AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134')) 会产生一些乱码。将其存储到合适大小的BLOBVARBINARY(..) 中。那么

SELECT AES_DECRYPT(the_blob, UNHEX('6E6F727468656173744032303134'))

将生成字符串12.21。如果您将INSERT 那个字符串转换成DECIMAL(15,2),它应该可以正常工作。

如果你存储到DECIMAL(65),它会去掉小数部分并给你一个12的值(这与12.21不同)。

如果您存储到DECIMAL(15,6),数字将相同(除了四个尾随零)。但请注意,小数点前只有 9 位的空间。等等。

测试用例:

mysql> SELECT AES_DECRYPT(AES_ENCRYPT(12.21,
                  UNHEX('6E6F727468656173744032303134')),
                  UNHEX('6E6F727468656173744032303134'));
+---------------------------------------------------------------------------------------------------------------+
| AES_DECRYPT(AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134')), UNHEX('6E6F727468656173744032303134')) |
+---------------------------------------------------------------------------------------------------------------+
| 12.21                                                                                                         |
+---------------------------------------------------------------------------------------------------------------+

注意加密后的值是 16 字节的倍数:

mysql> SELECT LENGTH(AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134')));+-------------------------------------------------------------------+
| LENGTH(AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134'))) |
+-------------------------------------------------------------------+
|                                                                16 |
+-------------------------------------------------------------------+

+----------------------------------------------------------------------------------+
| LENGTH(AES_ENCRYPT(1234567890.123456789, UNHEX('6E6F727468656173744032303134'))) |
+----------------------------------------------------------------------------------+
|                                                                               32 |
+----------------------------------------------------------------------------------+

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2014-12-23
    • 2011-12-09
    • 2019-11-18
    相关资源
    最近更新 更多