2011-08-23 73 views
1

當我嘗試將新用戶的密碼放入MySQL數據庫時,它不會正確加密它。這裏是我使用的代碼:這些密碼有什麼問題?

$encPassword = hash('sha256', $_POST['password']); 
    $query = sprintf("INSERT INTO users(`userName`,`email`,`password`) 
     VALUES('%s','%s',PASSWORD('%s'))", 
     mysql_real_escape_string($_POST['userName']), 
     mysql_real_escape_string($_POST['email']), 
     mysql_real_escape_string($encPassword))or die(mysql_error()); 
    $sql = mysql_query($query); 

雖然我檢查數據庫,但它不存儲密碼爲SHA256加密。它只有16個隨機字符(應該有50個)。它出什麼問題了?

+0

是您的字段VARCHAR具有適當的長度嗎? – mkk

+0

數據庫中的密碼字段是什麼類型? –

+0

我會推薦CHAR(64)或BINARY(256)。不是說它有很大的區別,我想:) – Ryan

回答

3

我不認爲你應該使用PASSWORD關鍵詞:http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_password

的PASSWORD()函數在 使用的認證系統的MySQL服務器;你不應該在你自己的應用程序中使用它。對於 這個目的,請考慮MD5()或SHA1()。有關在您的應用程序中安全地處理密碼和驗證 的更多信息,請參閱RFC 2195, 第2部分(質詢 - 響應驗證機制(CRAM)), 。

但是,您已經在第一行代碼上散列了密碼。只需將其直接插入數據庫中...

+0

sha256是一個* hash *函數,不是加密算法。散列算法被設計爲單向的,即。不可逆的。你應該編輯你的答案,說「哈希」,而不是「加密」。 –

+0

我已經改變它更具體。但在我的辯護中,「加密」並不是錯的 - 散列只是一種特定類型的加密。 –

+1

我必須不同意(請參閱http://stackoverflow.com/questions/326699/difference-between-hashing-a-password-and-encrypting-it)。散列和加密都在* cryptography *領域,但它們有根本的不同。散列是不可逆的,而根據定義,加密必須是雙向的。每個加密函數都必須有一個解密函數。 –

4

檢查您的表格中允許使用正確的列長度。這是最常見的問題。您的字段必須至少爲VARCHAR(64)

+0

@minitech:我不確定。是。抱歉,編輯 – genesis

+0

對不起,我剛剛看到OP使用'PASSWORD',根據http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#將結果存儲在41個字符中function_password。無所謂:P – Ryan

+0

@minitech:沒關係,他也可以用64,也不會殺了他:) – genesis

0

您是否在INSERT之前檢查了$encPassword的值?

0

這是因爲您在查詢中使用了PASSWORD('%s')函數(因此您要對密碼進行雙重散列處理)。

只需插入爲其它值('%s'