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

时间:2013-04-30 15:37:04

标签: mysql encryption

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

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

最近我注意到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

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

2 个答案:

答案 0 :(得分:4)

根据documentation

  

ENCRYPT()忽略除str的前八个字符之外的所有字符,至少在某些系统上是这样。此行为由底层crypt()系统调用的实现决定。

答案 1 :(得分:1)

回答您的其他问题:

使用密码中的前两个(或任何)字符作为盐也是错误的。盐的想法是为加密密码提供一些随机性,以便具有相同密码的用户将具有不同的哈希值。

使用已建立的加密库(例如bcrypt)来处理您正在使用的编程语言。