【问题标题】:Unable to AES_DECRYPT after AES_ENCRYPT in mysql在 mysql 中的 AES_ENCRYPT 之后无法进行 AES_DECRYPT
【发布时间】:2013-05-09 12:18:40
【问题描述】:

我创建了用户表

CREATE  TABLE `user` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`first_name` VARBINARY(100) NULL ,
`address` VARBINARY(200) NOT NULL ,
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

我插入了一行:

INSERT into user (first_name, address) VALUES (AES_ENCRYPT('Obama', 'usa2010'),AES_ENCRYPT('Obama', 'usa2010'));

要选择我使用的这一行:

SELECT AES_DECRYPT(first_name, 'usa2010'), AES_DECRYPT(address, 'usa2010') from user;

我得到以下结果。我需要做什么来查看我的数据。没有数据对我可见。

【问题讨论】:

  • 在这里工作sqlfiddle.com/#!2/31323/2
  • 但是我为什么会这样。有什么原因
  • 你用的是什么版本的mysql?
  • 尝试投射,CAST(AES_DECRYPT(first_name, 'usa2010') AS CHAR(50)) 看看它是否有效。
  • 是的,它现在正在工作。谢谢你这是什么原因

标签: mysql encryption


【解决方案1】:

根据手册:

AES_ENCRYPT() 加密字符串并返回二进制字符串。 AES_DECRYPT() 解密加密字符串并返回原始字符串

我不知道为什么在你的情况下它仍然返回一个二进制字符串。不管怎样,试试这个:

SELECT *, 
       CAST(AES_DECRYPT(first_name, 'usa2010') AS CHAR(50)) first_name_decrypt 
FROM   user

并使用first_name_decrypt 而不是first_name

【讨论】:

  • 在我们的服务器上做同样的事情 (5.5)
  • 注意:(50) 可能适用于本示例,但对于其他示例来说不够长。
【解决方案2】:

从mysql命令行客户端不需要使用CAST:

mysql> SELECT AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc');

+-----------------------------------------------+
| AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') |
+-----------------------------------------------+
| admin                                         |
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CAST(AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') AS CHAR (50));

+------------------------------------------------------------------+
| CAST(AES_DECRYPT(AES_ENCRYPT('admin','abc'),'abc') AS CHAR (50)) |
+------------------------------------------------------------------+
| admin                                                            |
+------------------------------------------------------------------+
1 row in set (0.02 sec)

正如您所见,在命令行中使用 cast 有点慢。但是我注意到如果你使用一些工具,比如phpmyadmin,那么你需要使用CAST,否则结果会出错。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,原来我在加密数据时将列数据类型设置为 VARCHAR,当我切换到 MEDIUMTEXT 时,它除了 BLOB 不会返回任何其他内容。

    引用 dev.mysql 的一部分:

    许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有 VARBINARY 或 BLOB 二进制字符串数据类型的列。这将避免尾随空格删除或字符集转换可能会更改数据值的潜在问题,例如,如果您使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)可能会发生这种情况。

    切换到支持的列类型对我有用。

    【讨论】:

      【解决方案4】:
      if (isset($_POST['user_name']) and isset($_POST['user_password'])){
      
      $user_name = $_POST['user_name'];
      $user_password = $_POST['user_password'];
      
      
      $query = "SELECT * FROM `user_tbl` WHERE user_name='$user_name' and AES_DECRYPT(user_password , '@ert') = '$user_password'";
      
      $result = mysqli_query($connection, $query) or die(mysqli_error($connection));
      $count = mysqli_num_rows($result);
      

      【讨论】:

      • 没有解释的代码并不是很有用。请解释什么是重要部分,以及为什么它回答了这个问题。
      • 此外,该代码对 SQL 注入广泛开放。绝对不应该在任何地方使用它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2023-03-10
      • 2013-01-03
      • 1970-01-01
      相关资源
      最近更新 更多