2010-10-30 134 views
-1

我要加密密碼的語法如下:如何在PHP中加密和解密密碼?

CWsodEV5xi9F0D8Vxw1fSZ ==

我不知道請我想要加密&解密函數是什麼樣的這種加密語法

感謝

+5

我認爲這看起來像Base64編碼 - 請參閱http://php.net/manual/en/function.base64-encode.php。它的*不*加密,只是編碼。對於應用程序,通常不會存儲實際的密碼,但是密碼不可逆(原則上)SHA或MD5散列。 – 2010-10-30 21:22:50

+0

請不要讓密碼在您的網站上解碼。並且一定要包括鹽。使密碼可解碼是非常不負責任的,並且沒有必要解碼某人的密碼的理由。當有人丟失密碼時,只需重置密碼。 – polyhedron 2010-10-30 21:51:24

回答

2

我不確定你想要完成什麼,但一般來說:請開發應用程序,以便用戶密碼不能以任何方式以明文形式檢索(例如,無解碼功能)。因爲許多用戶在多個服務上使用相同的密碼,所以如果技術上可以查看用戶的密碼,我認爲這是不好的做法:如果服務(或您的託管公司)以某種方式無法保護,比如說數據庫與密碼+ mailadresses,這些用戶是公開的:這些憑據可能打開大門濫用在不同的應用程序/網站上的大門。簡而言之:我甚至不希望看起來對此負責。

正如上面的一些答案指出的那樣,在您的密碼系統/數據庫中使用安全散列算法是非常可取的。Hash函數是irrevirsible,這意味着:如果你做

valid_key = sha1(password + salt); // store in database when user chooses/changes password 

,然後,如果你要的是驗證用戶的身份,你只是做一遍: 提供鹽(也可在數據庫,可以是用戶名和/或隨機值),然後重新計算哈希:

user_key = sha1(password_attempt + salt) 

然後,您只需將user_key比作valid_key:

if(user_key == valid_key) 
    // authentication succesfull 
else 
    // wrong password 

這只是一個小例子,當然有許多不同的實現和哈希算法,這些只是基礎知識。

散列的另一個好處是:散列(你存儲在你的應用程序中,例如數據庫)永遠是相同的長度(sha1總是160位十六進制值)。

因此,您可以讓偏執狂用戶能夠創建一個瘋狂長度的密碼(如果他們喜歡的話),以及所有陌生字符(如反引號或空格)的kinsd,但它不會浪費任何額外的存儲空間。

希望我給你你需要的信息。當然,也許你已經知道散列等,只是尋找一個特定的散列函數,它可能產生了你在問題中提供的散列。在這種情況下,就忽略這個帖子;)

[編輯] 現在有更好的替代品,如PBKDF2,Bcrypt (see this question)甚至Scrypt。請考慮這些方案之一,因爲它們更安全,特別是對於較短的密碼。

1

我覺得是的base64算法

0

要編碼的密碼:

$密碼= BASE64_ENCODE($ string_enter_by_user);

爲了解碼密碼:

$密碼= BASE64_DECODE($ string_enter_by_user);

注意:您至少應該使用像MD5這樣的單向密碼方法,如果有一天有人訪問您的數據庫,您的所有用戶密碼將受到保護。唯一的缺點是你永遠不會知道用戶的密碼。 MD5加密也將總是32個字符長。

要使用MD5:

$密碼= MD5($ string_enter_by_user);

+4

不知道你的用戶密碼不是缺點。 – geoffspear 2010-10-30 21:32:20

+0

此外,建議在沒有鹽的情況下使用md5是相當不負責任的,即使它的數量級比使用基數64要好。 – geoffspear 2010-10-30 21:33:34

+0

鹽問題歸因於密碼字典。更糟糕的是你可以做$ password = md5(md5(md5($ string))); – 2010-10-31 01:42:36

4

PHP有一堆內置的哈希函數,所以你可以使用這些。根據PHP參考,您可以使用md5,sha1hash函數。

請確保您在密碼之前密碼。鹽只是一個隨機數字添加到密碼,以防止彩虹表攻擊。確保鹽對每個用戶來說都是新的和隨機的。

因此,您的密碼數據庫應該包含三列:用戶名,鹽和散列。您可以通過使用存儲的鹽重複該過程並比較散列來驗證密碼。永遠不應將密碼存儲爲未加密或未加密。

您描述的格式看起來像base64,它不是加密或散列。請參閱其他答案以瞭解如何對base64進行編碼/解碼,但請記住,如果您正在處理密碼,則需要正確的散列。