2016-02-05 38 views
0

我測試使用SHA1散列和我已插入一行:MySQL在SHA1空select返回哈希密碼

insert into tbl_user (username, password, email) values ('maysam', sha1('21lf892'), '[email protected]'); 

,當我想選擇一排就像使用:

select * from tbl_user where password = sha1('21lf892'); 

而結果是:

Empty set (0.00 sec) 

但如果我嘗試使用類似用戶名選擇:

select * from tbl_user where username = 'maysam'; 

+----+----------+--------------------------------+-----------------------+ 
| id | username | password      | email     | 
+----+----------+--------------------------------+-----------------------+ 
| 2 | maysam | dd989b1d1d67c6e706852024ccb6a1 | [email protected] | 
+----+----------+--------------------------------+-----------------------+ 

是什麼問題?爲什麼不能選擇?(我已經測試散列和MD5和SHA2選擇....

+0

PS這不是存儲密碼的安全方法。 –

+0

我測試的d使用ubuntu終端。和@Rocket Hazmat:這只是爲了測試。 – senaps

+0

「21lf892」的SHA1哈希實際上是'dd989b1d1d67c6e706852024ccb6a1a436bcf396'。 –

回答

2

一個SHA1哈希是160bits,即40個字符以這種方式格式化時。

你的表似乎有密碼列的長度設置爲小於此值,因此數據在插入時被截斷並且不再等於sha1('21f892')

順便說一句,無鹽SHA1哈希是存儲密碼的一種非常弱的方法。像bcrypt或scrypt。

+0

我的密碼字段是一個varchar(50)....什麼是密碼最好的提交類型?這是測試,我會哈哈sha1的安全性... – senaps

+0

@senaps:如果你正在存儲SHA1散列,使用'char(40)'。 –

+0

@senaps:如果您使用PHP,看看['password_hash()'](http://php.net/password_hash)。它使用bcrypt來散列密碼,並且比SHA1安全得多。對於這一點,你會想'爲varchar(255)'PASSWORD_DEFAULT'(或'CHAR(60)''爲PASSWORD_BCRYPT')'。 –