簡體   English   中英

PHP salt加密/解密密碼

[英]PHP salt encrypt/decrypt password

我正在嘗試進行注冊並登錄具有鹽加密的表單,我並不熟悉它。 所以一切正常,除了登錄無法識別密碼所以我很確定它是加密問題。 這些是注冊行:

$hash = hash('sha256', $password1);
function createSalt()
{
$text = md5(uniqid(rand(), true));
return substr($text, 0, 3);
}
$salt = createSalt();
$password = hash('sha256', $salt . $hash);

這些是用於登錄:

$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
if($hash != $userData['password'])
{
echo "Incorrect password";
}

任何人都可以指出這個問題。 謝謝!

實際上你的代碼應該盡我所能,雖然它是非常不安全的!

  1. 問題:SHA256不適合散列密碼,因為它太快了。 使用像BCrypt這樣的慢鍵派生函數。
  2. 問題:只有字母的三字鹽幾乎沒有保護。

也許您的數據庫字段小於64個字符,或者您正在比較不同的密碼。 在每種情況下,都有一種更簡單,更安全的哈希密碼方法,只需使用新功能password_hash()password_verify() 還存在早期PHP版本的兼容包

// 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);

這有很多不妥之處。 對於初學者:您是否使用密碼存儲鹽? 如果沒有,則密碼變得無法驗證。

安全考慮:

hash('sha256', ...不夠;考慮bcrypt,scrypt或pbkdf2

$text = md5(uniqid(rand(), true)); 有沒有聽說過openssl_random_pseudo_bytes()

(另外,您不應該嘗試解密密碼,只能驗證密碼。)

如果您不熟悉這些概念,請安全地使用並使用經過驗證的真實庫。

暫無
暫無

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

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