【问题标题】:What Am I doing worng? Decrypting an AES on MySQL using AES_DECRYPT我究竟做错了什么?使用 AES_DECRYPT 在 MySQL 上解密 AED
【发布时间】:2014-02-10 02:14:42
【问题描述】:

我设法使用 AES_ENCRYPT 加密了密码。

SELECT
acc.id,
acc.user_id,
acc.type,
acc.account,
acc.`password`,
acc.`status`
FROM
acc

返回这个:

id      user_id   type          account         password                   status    
16      4         Main          xjdkdndn        xU+WHHT9Eidt8J+xoNMbKw==   0    

密码显然是加密的。我正在尝试使用它来解密它:

SELECT AES_DECRYPT(password,'fawefwefwaef4waegdf235twe4rsgrdtgw54ershtfg')
FROM acc;

fawefwefwaef4waegdf235twe4rsgrdtgw54ershtfg 是加密密钥。

但是它总是返回一个空值。

我做错了什么?

忘记加了,密码是fkdkfjkddk

编辑:

伙计们,我将我的 mysql 升级到 5.6 版本,现在返回的是这个:

这看起来像是可以进行 aes 编码的东西,但后来我使用 AES_DECRYPT,它仍然返回一个 NULL 值。

有什么猜测吗?

【问题讨论】:

    标签: php mysql encryption aes


    【解决方案1】:

    假设您的加密密钥是正确的,这将从 16 的用户 ID 中选择密码字段,然后尝试对其进行解密并将其作为 UTF8 编码字符串传回给您。

    SELECT password, CONVERT(AES_DECRYPT(FROM_BASE64(password), 'fawefwefwaef4waegdf235twe4rsgrdtgw54ershtfg') USING utf8) AS `password` FROM `acc` WHERE `id` = 16
    

    【讨论】:

    • 这返回了加密密码。
    • 我编辑了答案。您需要先从 base64 解码您的密码,然后再解密(因为它存储为 base64 编码字符串)。这仅适用于 MySQL 版本 > 5.6+。另一种选择是将加密的密码存储为 BLOB。
    【解决方案2】:

    尝试使用AS,例如:

    SELECT AES_DECRYPT(acc.password,'fawefwefwaef4waegdf235twe4rsgrdtgw54ershtfg') AS my_decrypted_pa​​ssword FROM acc;

    补充: 上面的代码是我正在使用的,它运行良好,但是 adamS 是正确的,您确实希望将密码存储为 Blob 或 TinyBlob。这可能是您返回 null 的原因,因为没有存储任何内容,并且您看到的是 NULL 加密,而不是您的密码,即您在上面显示为 xU+WHHT9Eidt8J+xoNMbKw== 的内容只是NULL,它不是你的密码。换成 Blob 或 Tinyblob 就可以了。

    【讨论】:

    • 这将返回一个 NULL 值。
    • 我正在尝试找到一种方法将我的文本列转换为 blob,但我找不到方法,只能反过来。可以举个例子吗?
    【解决方案3】:

    我在我的数据库上安装了这个:http://wi-fizzle.com/downloads/base64.sql,现在它可以工作了!

    感谢大家的帮助。

    【讨论】:

      【解决方案4】:

      您拥有的加密密码在 base64 中,我怀疑您在解密时没有从 base64 转换。您将需要从 base64 转换。它应该是这样工作的:

      SELECT to_base64(aes_encrypt('fkdkfjkddk','fawefwefwaef4waegdf235twe4rsgrdtgw54ershtfg'));
      

      返回:pS9sEA/o6XAaUYud631R2g==

      SELECT aes_decrypt(from_base64('pS9sEA/o6XAaUYud631R2g=='),'fawefwefwaef4waegdf235twe4rsgrdtgw54ershtfg');
      

      返回:fkdkfjkddk

      【讨论】:

        【解决方案5】:

        当我使用 VARCHAR(200) 而不是 TEXT 来存储我的加密字符串时,问题已解决。

        这是我的工作解决方案:

        加密(将我的列存储为加密字符串)

        UPDATE `table` 
        SET `column_name` = TO_BASE64(
            AES_ENCRYPT(
                'data', 
                SHA2(
                    CONCAT(
                        'my app salt',
                        'my very good encryption key / passphrase'
                    ),
                    512
                )
            )
        );
        

        解密(读取我的表格)

        SELECT *, 
        AES_DECRYPT(
            FROM_BASE64(`column_name`), 
            SHA2(
                CONCAT(
                    'my app salt',
                    'my very good encryption key / passphrase'
                ),
                512
            )
        ) AS `column_name`
        FROM `table`
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-06
          • 1970-01-01
          • 2015-02-19
          • 2016-07-18
          • 1970-01-01
          • 2019-12-23
          • 2014-06-15
          • 1970-01-01
          相关资源
          最近更新 更多