MySQL Encrypt在错误的字段上返回true,数字为salt

时间:2011-10-03 09:19:42

标签: mysql encryption passwords

我不完全确定如何描述这一点,所以最简单的方法是使用测试用例。运行以下sql将在select上返回三行。我对加密的理解告诉我,这不应该返回任何行。

只有当盐以两个数字开头时才会发生。

请忽略加密被称为如何的事实。它是一个遗留应用程序,我需要在进行更改之前了解发生的情况。

CREATE TABLE IF NOT EXISTS `test` (
  `user` varchar(10) NOT NULL,
  `pass` varchar(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `test` (`user`, `pass`) VALUES
('user', '11');
INSERT INTO `test` (`user`, `pass`) VALUES
('user', '22');
INSERT INTO `test` (`user`, `pass`) VALUES
('user', '33');
INSERT INTO `test` (`user`, `pass`) VALUES
('user', 'aa');


SELECT *
FROM `test`
WHERE encrypt( 'user', test.pass )

2 个答案:

答案 0 :(得分:0)

明确提到

Here

  

如果你的系统上没有crypt()(就像那样)   Windows),ENCRYPT()始终返回NULL。

首先检查crypt()是否可用

答案 1 :(得分:0)

检查没有WHERE子句的输出 -

SELECT *, ENCRYPT('user', pass) FROM test;
+------+------+-----------------------+
| user | pass | ENCRYPT('user', pass) |
+------+------+-----------------------+
| user | 11   | 11VKs9AZ4WOfc         |
| user | 22   | 22QsW1gRCcd2I         |
| user | 33   | 33PLcxSqvhZnc         |
| user | aa   | aaBrLCcg4bKmQ         |
+------+------+-----------------------+

使用WHERE子句时,此值将转换为boolean;在您的情况下,值'11VKs9AZ4WOfc'为TRUE,但'aaBrLCcg4bKmQ'为FALSE。

这是一个可以解释这种行为的小例子 -

SELECT 'A' = TRUE, '1' = TRUE;
+------------+------------+
| 'A' = TRUE | '1' = TRUE |
+------------+------------+
|          0 |          1 |
+------------+------------+

我认为你的一些值被转换为TRUE,有些则被视为FALSE。