2010-07-22 133 views
-1

我正在使用PHP和Mysql。我想知道如何使用MD5發送密碼散列,並希望在用戶嘗試登錄時檢查它。我嘗試過,但無法正常工作。如果有人知道如何去做,請給我提供代碼。如何在用戶註冊和登錄系統中實現MD5散列?

+0

首先,值得注意的是MD5不加密,它是一種散列或摘要算法。當你說「發送密碼在md5中加密」你的意思是在用戶的請求到服務器,或從你的PHP文件到MySQL? – 2010-07-22 02:38:42

+1

Robus說得對,但如果你想保存Hazel,你可以使用這個PHP身份驗證類http://www.phpclasses.org/package/6174-PHP-Manage-registrations-and-authenticate-users.html – Pablo 2010-07-22 02:39:36

+0

它可能是我對挑選單詞很挑剔,但你在哪裏發送哈希密碼?另外,如果你不使用鹽,你應該。此外,您可能還想考慮更安全的哈希函數。 – Slartibartfast 2010-07-22 02:51:14

回答

0
//Register: 
$the_magical_salt = "everybody_is_obsessed_with_these_days$3^^2)(%=-"; // Even_though_md5_shouldnt_be_used 
mysql_query('insert into users values (NULL,'.$filtered_username.','.md5($password.$the_magical_salt).');'); 
//Login: 
$res = mysql_query('select password from users where username = '.$filtered_username); 
$res = mysql_fetch_array($res); 
if(md5($_POST['password'].$the_magical_salt) == $res[0]) echo "Yeah, you're welcome."; 
else echo "Wrong password sugar"; 

除了使用md5()函數兩次以外,沒有太多內容。

+2

您應該使用並存儲鹽 - 一個隨機數 - 以防止對密碼進行離線哈希攻擊。另外,MD5作爲哈希機制還不夠。它不會被像布魯斯·施奈爾這樣的人推薦(並且現在還沒有被推薦多年)。 – 2010-07-22 02:40:17

+0

+1,因爲我使用了類似的錯誤密碼。哦,憤怒的電子郵件 – 2010-07-22 02:44:24

+2

@Robus - 如果你打算使用鹽,它應該是加密唯一的每個用戶,並將密碼存儲在數據庫中,而不是在PHP代碼中進行硬編碼。 – 2010-07-22 02:52:19

5

md5不太適合這個目的。閱讀this article以瞭解最新情況,但簡短版本是您應該使用bcrypt來代替。 Google快速顯示PHPass聲稱支持bcrypt

更新:由於@ Dragontamer5788在評論中指出,scrypt甚至比理論上的bcrypt更好。作者擅長加密技術,但請注意,此時的評論數量少於現實世界的曝光量,而不是bcrypt。我可能仍會選擇它,但它不像md5上的bcrypt

+1

PHP 5.3+支持BCrypt in它的「crypt」功能,而PHP 5.2及更早的版本可以通過PHP Suhosin Patch(它實現了BCrypt到PHP)。技術上說,「scrypt」比BCrypt更好,因爲它存在內存約束和CPU約束。但是BCrypt是目前最廣泛使用的密碼功能,不妨直接使用它,直到好的scrypt實現存在爲止,這個答案需要更多upvotes – Dragontamer5788 2010-12-01 20:38:36

0

沒有更多的信息,這將是很難幫助你,但我相信你想要的是Digest Authentication

下面是一個例子(實施例具體#7)從PHP文檔:http://php.net/manual/en/features.http-auth.php

注意,此類型的認證不防止對人在中間人攻擊。例如,如果某人正在嗅探受害者網絡上的流量,則攻擊者可以簡單地使用消化的用戶名/密碼組合重新播放該請求,並且您的PHP腳本會高興地將攻擊者認證爲受害者。

+0

我想將密碼從php textfield保存到mysql表中,它是一個普通的用戶註冊和登錄系統,我使用db加密保存,但是當我使用select查詢來檢查登錄密碼和用戶已經提供的密碼是否相同時,儘管它們是相同的。我很困惑, – Mujahid 2010-08-01 04:13:19

+0

好吧謝謝大家,我可以做到這一點,我將它保存爲MD5(),當我檢查密碼時,我使用相同的MD5(),所以它工作正常:) – Mujahid 2010-08-27 05:59:14