簡體   English   中英

比較加密的密碼mysql / php

[英]Compare encrypted password mysql/php

數據庫通過以下方式加密密碼:

encrypt('password', CONCAT('$', MD5(RAND()))));

我正在PHP中選擇此值,我想將其與用戶輸入進行比較。 那么如何在PHP中重新創建以上內容? 我不明白的是,如果加密密碼依賴於隨機數,那么如何在php中生成相同的字符串並將其與原始字符串進行比較呢?

最好的方法是在數據庫站點上使用存儲過程或函數,該存儲過程或函數將為用戶/通過查詢返回true / false。 這樣一來,您只有一個功能就能擁有一個功能。

即使您不想創建其中之一,也不想 php產生的db查詢中使用相同的功能。

沒錯,由於在mysql函數中未提供鹽,因此無法在php中重新創建密碼。 我的建議是在mysql和php中提供相同的鹽。 確保將此值保存在安全的地方。

每個mysql加密文檔:

使用Unix crypt()系統調用對str進行加密,並返回一個二進制字符串。 salt參數必須是至少包含兩個字符的字符串,否則結果將為NULL。 如果未給出salt參數,則使用隨機值。

請注意最后一部分:如果未給出salt參數,則使用隨機值(您的情況)。

似乎MySql函數encrypt()使用Unix crypt()函數。 在這種情況下,您很可能會創建不安全的DES哈希,並且“鹽”將作為結果哈希值的一部分存儲。 為了進行驗證,您可以使用PHP crypt()函數,如下所示:

$isPasswordCorrect = crypt($password, $existingHashFromDb) === existingHashFromDb;

請注意,以這種形式存儲密碼是非常不安全的 ,因為這種哈希算法對於哈希密碼而言太快了。 相反,您應該使用像BCrypt這樣的鍵派生函數,PHP為此具有自己的函數password_hash()

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM