2010-10-20 102 views
6

我有一個密碼從我的iPhone應用程序通過php腳本user.php傳遞給數據庫。在存入數據庫之前加密密碼?

變量$傳球被填充如下:

$pass = str_replace("'", "", $_REQUEST['pass']); 

我怎樣才能加密此它插入到我的數據庫之前?我讀了一些關於不同的技術,但尋找最好的方法來管理這個。

感謝大家。

+0

無關:使用正確的輸入逃逸,不靠'str_replace'過濾掉所有引號 – knittl 2010-10-20 20:46:17

+0

它是從一個iPhone應用程序來,通過URL傳遞給腳本。 – BigMike 2010-10-20 20:50:33

+0

另見的OpenWall的[便攜式PHP的密碼哈希框架(http://www.openwall.com/phpass/)(PHPass)。它強化了對用戶密碼的一些常見攻擊。 – jww 2014-10-11 23:34:57

回答

6

如果你不關心檢索的實際密碼的值(從數據庫加密後的值),你可以在它上面運行單向散列算法(如sha1:http://php.net/manual/en/function.sha1.php)。該函數將返回一個特定長度的字符串(散列),它不能用於查找原始字符串(理論上)。有可能兩個不同的字符串可以創建相同的散列(稱爲衝突),但這不應該是密碼問題。
例子: $pass = sha1($_REQUEST['pass']);

一件事,讓它多一點安全是鹽添加到哈希並再次運行哈希函數。這使得惡意地生成密碼哈希變得更加困難,因爲鹽值僅在服務器端處理。
例子: ​​

+1

這不是一個合適的鹽。鹽對於應用程序的每個用戶都不相同。相反,它是用戶特定的。 – middus 2010-10-20 20:19:42

+0

我用過這個。它正在工作,並不需要超級神祕。 – BigMike 2010-10-20 20:45:06

1

的最基本的:用MD5或SHA-1

$newpass = md5($_REQUEST['pass']); 

$newpass = sha1($_REQUEST['pass']); 

最近,我開始進行存儲散列以及用戶名散列,所以登錄嘗試是安全的只使用散列數據進行比較。

你可以用額外的數據「散佈」哈希,所以如果它們被破壞,它的價值無法找到(嘗試使用谷歌搜索一些簡單的散列字)..即使用一個站點範圍的字符串只是爲了改變標準哈希,如md5("mySiteSalt!!" . $_REQUEST['pass']);或更先進的東西。

+2

md5不適用於加密。 – Chris 2010-10-20 19:44:04

+1

@Chris爲了記錄,哈希是一種加密形式(儘管是單向的)。無論如何,MD5不應該被用來存儲密碼。有了今天的彩虹表,它和明文一樣好。 – mattbasta 2010-10-20 19:47:58

+0

永遠不要說哈希不是一種加密的形式,我只是說md5不是用於加密的。那麼爲什麼你建議使用md5來「加密」OP的密碼。在使用md5進行密碼加密創建另一個具有複雜安全感的用戶之前,至少要解釋您的答案。 – Chris 2010-10-20 19:48:55

0

您應該使用SHA1哈希您的密碼存儲在數據庫中。這是存儲密碼的最簡單但最有效的方式:

$password = sha1($password); 

這也是特別安全。雖然它的完整性開始蔓延,但將此功能升級到SHA-256(這非常安全)相當容易。

+0

SHA1太快。請參閱我答案中的鏈接。 – middus 2010-10-20 20:25:22

+0

@middus它肯定是太快了,但它比MD5使用的空間多30%,所以至少表格要大一些。另外,如果某人有足夠的權限訪問數據庫來收集哈希密碼,他們很可能會竊取大量其他未加密的信息。 SHA1不是「很好」,但它會在95%的情況下完成。 – mattbasta 2010-10-20 21:21:53

0

要找出原因MD5,SHA1和他們迅速的朋友可能不是一個好主意,你應該閱讀由Thomas Ptacek後Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes。要點:

最後,我們瞭解到,如果我們想 存儲密碼安全,我們有三個 合理的選擇:PHK的MD5方案, Provos-Maziere的Bcrypt方案,並 SRP。我們瞭解到,正確的 選擇是Bcrypt。

注:這是PHK,而不是PHP。

2

首先,你應該創建一個隨機的用戶鹽。然後,您應該將該密碼和密碼哈希存儲在數據庫中。

$salt = md5(unique_id().mt_rand().microtime()); 
$pass = sha1($salt.$_REQUEST['pass']); 

並在數據庫中保存$ salt和$ pass。然後,當他們去登錄你看他們的行和檢查哈希:

$user = query('SELECT * FROM `user` WHERE username = ?', array($_REQUEST['username'])); 

if($user) 
{ 
    // If the password they give maches 
    if($user->pass === sha1($user->salt. $_REQUEST['pass'])) 
    { 
     // login 
    } 
    else 
    { 
     // bad password 
    } 
} 
else 
{ 
    // user not found 
} 

創建爲每個帳戶確保彩虹表是無用的,任何人闖入你的服務器的用戶鹽會有暴力破解每個密碼。

相關問題