带有salt的MySQL encrypt()在密码后接受随机字符

标签 mysql encryption

我有一个包含用户名和加密密码的表。

密码是通过 MySQL encrypt() 和盐(密码的前两个字符)一起加密的。

最近我注意到 MySQL 接受密码,即使密码末尾包含随机字符也是如此。

假设我们有这样一张表:

SET NAMES utf8;
SET foreign_key_checks = 0;
SET time_zone = 'SYSTEM';
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `user` (`id`, `username`, `password`) VALUES
(11,    'ricardomontalban', ENCRYPT(11111111,11));

现在我查询我的用户:

-- The following shows the appropriate response --
SELECT * FROM user WHERE username = "ricardomontalban" AND password = ENCRYPT(11111111,11);

-- HOWEVER, the following query also shows a result, even with random characters appended!!! --
SELECT * FROM user WHERE username = "ricardomontalban" AND password = ENCRYPT("11111111-55669964s5465sqsfqsdf",11);

-- No problem with prepended random characters though --
SELECT * FROM user WHERE username = "ricardomontalban" AND password = ENCRYPT("smlkfjmlsdkfjslqf-11111111",11);

我创建了一个 SQL Fiddle 来实时显示这个例子: http://sqlfiddle.com/#!2/898d5/9

我做错了什么?我什至应该使用这种加密方法吗? 非常感谢任何建议。

最佳答案

根据 documentation :

ENCRYPT() ignores all but the first eight characters of str, at least on some systems. This behavior is determined by the implementation of the underlying crypt() system call.

关于带有salt的MySQL encrypt()在密码后接受随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16303711/

相关文章:

python - 如何将成对数组列表转换为 2x1 数组?

SSL 代理/解密?

mysql - SQL Server 2012 数据集成

php - Mysql/PHP错误: not displaying $username

sql - 多表查询

mysql - MySQL中表之间的关系

javascript - 在哪里存储敏感数据?

ios - 如何在 iOS 中创建受密码保护的 zip 文件

security - 从用户的 RSA 公钥计算用户的私钥

java - 使用JDBC和MySQL解决“通信链接失败”问题