2013-03-30 265 views
0
insert into test(username,pwd) values('Jim',ENCODE('123456','Jim')); 
select username from test where username='Jim' and pwd=ENCODE('123456','Jim') 

insert into test(username,pwd) values('Ryan',SHA('123456')) 
select username from test where username='Ryan' and pwd=SHA('123456') 

insert into test(username,pwd) values('Jack',MD5('123456')) 
select username from test where username='Jack' and pwd=MD5('123456') 

爲什麼我通過使用SHAMD5得不到正確的結果?密碼都是123456,但使用不同的加密方法,我無法得到正確的結果。MySQL密碼加密驗證

第一個可以正確輸出「Jim」。但第二個和第三個不能輸出「Ryan」或「Jack」,結果集爲null。爲什麼?我想知道如何通過加密密碼驗證用戶。

+0

它爲我 – serans

+1

什麼字段類型和長度是 「PWD」? MD5和SHA不是加密,而是散列 - 不同之處在於您可以反向加密,但散列只是一種方式。這不是你的例子的問題,但我想我應該指出。 – Steve

+0

此外,標籤「java」和「web」與問題 – serans

回答

1

難道是你做錯了什麼?對我來說工作得很好。

SQL Fiddle link with the queries

我的預感是你正在存儲哈希的截斷版本。

+0

這似乎是唯一的辦法,可能會失敗。 – Xnoise

+0

你的預感是對的。我忘了考慮長度... – Ryan

1

你需要改變你的字段類型爲你的20個字符VARCHAR場截斷散列:

MD5產生32個字符的字符串所以使用CHAR(32)

SHA產生一個64個字符的字符串,所以使用CHAR(64)

你應該總是使用CHARVARCHAR當你知道輸入的長度,性能方面的原因(SQL知道多少來分配)。