2013-04-30 79 views
0

我有一個用戶名和加密的密碼錶。MySQL加密()與鹽接受密碼後的隨機字符

密碼通過MySQL加密()與鹽(密碼的前兩個字符)一起進行加密。

最近我已經注意到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小提琴實時顯示這個例子: http://sqlfiddle.com/#!2/898d5/9

我在做什麼錯?我是否應該使用這種加密方法? 任何建議,非常感謝。

回答

4

作爲每documentation

ENCRYPT()忽略所有但str的前八個字符,至少在一些系統。這個行爲由crypt()系統調用的實現決定。

+0

感謝您的回答。這是否意味着密碼只能允許長度爲8個字符?你會建議不使用這種加密方法嗎? – maartenmachiels 2013-04-30 15:44:58

+0

不要使用加密密碼。這幾天它是一個無用的散列。如果你需要安全性,那麼使用強大的散列(md5,sha1)作爲啓動點,並認真考慮專用於pw保護的散列,如bcrypt。 md5/sha1總比沒有好,但是它們對計算要求非常敏感,它們變得非常容易暴躁。 – 2013-04-30 15:45:56

+0

謝謝。那就是加密。你知道任何有關bcrypt入門的好參考嗎? – maartenmachiels 2013-04-30 15:48:14

1

爲了回答您的其他問題:

從密碼使用前兩種(或任何)字符作爲鹽也是錯誤的。 salt的想法是爲加密密碼提供一些隨機性,以便擁有相同密碼的用戶擁有不同的哈希值。

對於您正在使用的任何編程語言,使用已建立的加密庫(如bcrypt)。

+0

感謝您指出了這一點! – maartenmachiels 2013-04-30 15:50:40