2013-05-10 98 views
1

我正在閱讀本教程,我正在使用ENCRYPT MySQL函數。MySQL ENCRYPT密碼但如何解密?

http://www.pixelinx.com/2010/10/creating-a-mail-server-on-ubuntu-using-postfix-courier-ssltls-spamassassin-clamav-and-amavis/

但現在我有一個如何在MySQL或在PHP解密加密的密碼問題?我想比較輸入的密碼是否與加密密碼相同。

我該如何比較? MySQL必須使用ENCRYPT函數加密!

我正在尋找,但我無法找到任何東西如何解密加密的MySQL函數...

+6

如果你試圖解密密碼,你*做錯了*。 – 2013-05-10 15:42:46

+1

你比較了encrypt()ed散列'select ... where savedhash = encrypt('newpassword')'。 – 2013-05-10 15:42:49

+0

奇怪的教程告訴你如何加密它,但不是如何處理它,一旦它被加密。 – Spudley 2013-05-10 15:45:41

回答

4

不能解密的密碼 - 它與單向加密方法加密。

你需要做的是加密輸入的密碼,並將結果與​​存儲的加密密碼進行比較。

11

ENCRYPT正在使用單向散列算法,沒有DECRYPT ..這就是加密密碼的含義:黑客應該沒有選項來查看明文密碼。

當你需要比較數據庫密碼與一個用戶輸入,使用這樣的查詢(使用準備好的查詢)

SELECT * FROM `user` 
WHERE `name` = 'hek2mgl` 
    AND `password` = ENCRYPT('user_input', `password`) 

ENCRYPT功能將輸出一個「鹹魚」的字符串前面加上鹽本身,所以反饋加密的密碼將重新提供原鹽。

+0

加密函數總是返回不同的值,所以不能在查詢中使用,取而代之的是使用密碼功能 – AjayR 2014-01-23 02:17:40

+1

是的,你說得對,當沒有鹽參數調用它時會使用隨機鹽。在寫答案時我沒有意識到這一點。您的評論非常感謝。在閱讀手冊後,我仍然認爲它可以用於密碼加密任務,但是必須正確處理鹽。我會盡快編輯答案。 – hek2mgl 2014-01-23 07:45:29

+0

參見:man crypt - 默認的「隨機」鹽值是加密短語的前兩個字符 – ceph3us 2016-06-11 00:59:49

0

您不需要解密密碼。爲了檢查用戶是否提交了正確的密碼,只需重新加密用戶給出的密碼,並檢查它是否與存儲在數據庫中的密碼相符。

Moreoever,一個簡單的哈希函數就足夠了(避免MD5和使用的鹽,以防止字典或彩虹表攻擊!)

+0

所以你建議加密('passwor','dsljfljfsdljfljsdf') – senzacionale 2013-05-10 15:48:05

+0

我建議$ hashed_pa​​ss = sha1(「password + salt」) ;。在每次散列密碼時都應該使用salt,您可以從用戶數據生成salt,保密鹽生成過程,將其存儲在db中,並確保它對每個用戶都是唯一的。 – 2013-05-10 15:50:36