2015-11-06 108 views
0

好的,我對如何製作安全的登錄系統有非常基本的瞭解。密碼存儲?

如果您嘗試登錄,你會得到嘗試的密碼哈希它例如MD5,嘗試匹配與存儲在某種數據庫/服務器的密碼哈希密碼(也散列)。

登記時它存儲在服務器上的MD5哈希值,而不是原來的。所以即使被破壞,也是無法追蹤的。 (即使存在具有哈希數據庫的服務,並且可以嘗試反向)。

我的問題是:如何存儲哈希?如果我使用了一個mysql數據庫,那麼它的內部代碼就會被硬編碼,而且我不用php編寫代碼,所以不能真正在網上編寫代碼。

我怎麼會藏在我的軟件MySQL的憑據?

+1

你應該加入鹽,以你的哈希太... – SJB

+0

MHM是的。關於我問了什麼的任何想法? – JustRayz

+1

也許有幫助? [使用PHP 5.5的'password_hash()'和驗證函數,我做對了嗎?](http://stackoverflow.com/questions/14992367/using-php-5-5s-password-hash-and-verify - 功能-AM-I-做,它右)。還有:[使用PHP 5.5密碼散列API哈希密碼](http://www.sitepoint.com/hashing-passwords-php-5-5-password-hashing-api/)。有一個兼容庫可用於早期的PHP版本。請將此用於密碼散列需求。它被嘗試和測試。 –

回答

1

不要生成自己的鹽。

研究PHP password_hashpassword_verify功能,幾乎可以滿足您的所有要求,自動且相當安全地使用PHP 5.5+。

http://php.net/manual/en/function.password-hash.php

而且

http://php.net/manual/en/faq.passwords.php

你也可以在PHP 5.3與IRCMaxwell取得了良好的修復使用。這裏:https://github.com/ircmaxell/password_compat

MD5已經嚴重受損,並且有各種各樣的彩虹表和碰撞函數可以找出MD5哈希字符串最初是什麼(可以選擇一些選項,它們是計算的花生)。做不是使用MD5散列私人數據。

「如何散列存儲」通過存儲哈希我想你的意思是你想存儲:

$hash = md5($password_plaintext'); 

如果是這樣,那麼你可以存儲這個在MySQL VARCHAR字段,在記錄中,通常人們使用用戶名密碼提交登錄信息,以便用戶名用於MySQL引擎查找該行,然後比較密碼哈希以查看它們是否匹配。

使用password_hash(),你會看的用戶名,然後檢索相關的密碼哈希字段值(只是值),然後與明文密碼從形式比較散:

if(password_verify($posted_login_password_plaintext, $hashfromDatabase)){ 
//if TRUEPassword matches. 
} 

這一切你需要的。你不需要,實際上不應該存儲用於散列的任何鹽。

+0

@RyanVincent標準方式散列工作,據我所知,散列鹽存儲在完整的散列本身。與加密不同。 – Martin