簡體   English   中英

以可逆形式存儲密碼

[英]Storing Passwords in reversible form

我有一個PHP應用程序需要運行bash腳本,並提供用戶名和密碼(用於遠程系統)。 我需要將這些憑據存儲在我的PHP(Web)應用程序可訪問的某個位置。 邏輯位置是數據庫(目前是MySQL,但是不可知)。 散列和存儲憑證的“標准”方式的問題在於它是不可逆的。 必須能夠以未加密的明文形式獲取憑證,以便能夠將數據插入到bash腳本中。

有沒有人有任何建議可以安全地解決這個問題?

我想也許是PKI的憑證,並將結果存儲在DB中。 然后使用私鑰解密(PHP可以做到這一點)。 存儲腳本以在Web根目錄外執行此操作。

任何想法都非常感激。

首先,說明(希望)明顯,如果你可以以任何方式避免存儲用戶名和密碼這樣做; 這是一項重大責任,如果您的憑據存儲被破壞,它可能會為同一用戶提供訪問許多其他地方(由於密碼共享)。

其次,如果您必須使用不可逆的鹽漬加密哈希來存儲憑證,而不是存儲密碼,那么如果您的數據受到損害,則密碼不能輕易地進行逆向工程,並且根本不需要存儲解密密鑰。

如果必須存儲可解密的憑據:

  1. 選擇一個好的加密算法 - AES-256,3DES(過時)或公鑰密碼(雖然我認為這對於這種用途是不必要的)。 使用來自信譽良好的可信賴來源的加密軟件 - 不要試圖自己動手,你可能會錯誤地認識它。
  2. 使用安全隨機生成器生成密鑰。 弱隨機性是加密相關安全性故障的首要原因,而不是密碼算法。
  3. 將加密/解密密鑰與數據庫分開存儲在O / S安全文件中,只能由應用程序運行時配置文件訪問。 這樣,如果您的數據庫被破壞(例如通過SQL注入),您的密鑰不會自動受到攻擊,因為這通常需要訪問HDD。 如果您的操作系統支持與配置文件綁定的文件加密,請使用它 - 它只能提供幫助,而且通常是透明的(例如NTFS加密)。
  4. 如果可行,請使用主密碼存儲密鑰本身。 這通常意味着您的應用。 將需要在啟動時鍵入的密碼 - 在腳本的參數中提供它是沒有用的,因為如果您的HDD被破壞,您必須假設密鑰文件和腳本都可以被查看。
  5. 對於每個憑證集,存儲salt (未加密)以及加密數據; 這用於“填充”加密密碼,使得兩個相同的密碼不會產生相同的密碼文本 - 因為這會泄露密碼是相同的。
  6. 如果沒有必要使用用戶名來查找帳戶記錄(在您的情況下不是這樣),請加密用戶名和密碼。 如果您對兩者進行加密,請將它們加密為一次加密運行,例如

    userAndPass =(用戶+ “:” +傳);
    encryptInit();
    加密(鹽);
    加密(userAndPass);
    密文= encryptFinal();

    並存儲奇異的blob,這樣就可以減少短密碼文本的出現,這些密文更易於破解,用戶名還可以進一步密碼。

PS:我不用PHP編程,因此無法在該環境中評論合適的加密s / w。

你需要研究好的雙向加密方法,我的一般經驗法則是:

如果您實現自己的加密代碼,您將失敗。

因此,找到一個經過充分驗證的良好實現,並利用它。

這里可能有一些很好的信息:

http://phpsec.org/library/

檢查這個庫: PECL gnupg它為您提供了與gnupg交互的方法。 您可以使用安全的公鑰加密算法輕松加密和解密數據。

我建議您不要存儲密碼,而是通過生成ssh密鑰並將公鑰存儲在遠程系統的authorized_keys文件中,使用從主機到遠程系統的無密碼ssh連接。 然后,您只需要在配置期間建立連接。 不可否認的是,並沒有完全回答你的問題,但是以可逆的形式存儲密碼對於安全漏洞來說是一個滑坡,盡管我確信聰明的大腦可以使它安全。

一個簡單的入門方法是使用mysql的ENCODE()和DECODE()函數。 我不知道下面使用了什么算法,但它很容易使用:

INSERT INTO tbl_passwords SET encoded_pw = ENCODE('r00t', 'my-salt-string');

SELECT DECODE(encoded_pw, 'my-salt-string') FROM tbl_passwords;

對於PHP,重要的是要注意AES加密通過MCRYPT_RIJNDAEL函數實現的。 當PHP有可用時,不要為非開放實現付費。

有關更多信息,請參閱討論可用密碼PHP頁面

如果你去PKI,我會,確保你保護你的私鑰! PKI提供的強大加密功能與密鑰一樣安全。

我認為你是目標。 看看GPG是否有一個好的開放式加密庫

看起來你幾乎有兩種方法可以做到這一點:

1)與您建議的一樣,使用加密算法或算法,然后可以解密並用於腳本中的身份驗證。 您可以使用PHP中的MCrypt庫來完成此任務。

2)根據所需的安全級別和腳本的漏洞級別,您可以使用安全散列,密鑰或其他一些難以猜測的唯一標識符,您可以使用該標識符在腳本范圍內劫持每個用戶的帳戶。

正如許多人所述,您需要加密用戶名和密碼。 我建議您查看php的mcrypt擴展名以進行加密/解密。

我想我將研究使用從Web應用程序中即時嵌入的憑據來編譯PHP腳本。

我會要求提供憑據(用於給定用途),然后創建並編譯一個新的PHP腳本,僅供此用戶使用。 這樣,腳本只會做我需要的,而且不應該是“可讀的”。 我認為這聽起來是最安全的方法。

將嘗試使用Roadsend。 http://www.roadsend.com/

為了跟進使用MySQL編碼和解碼功能的建議,手冊對這些工作方式含糊不清

加密的強度取決於隨機生成器的好壞程度。 它應該足夠短串。

但我建議你可以使用內置的MySQL 5.0 AES函數 ; AES_ENCRYPT()AES_DECRYPT()

SELECT AES_ENCRYPT('secret squirrel', '12345678') AS encoded

=> ØA;J×ÍfOU»] É8

SELECT AES_DECRYPT('ØA;J×ÍfOU»] É8', '12345678') AS decoded

=> secret squirrel

這些使用128位AES,對於大多數用途來說應該足夠強大。 正如其他人評論的那樣,使用鹽值和具有高熵的密鑰是一種很好的做法。

暫無
暫無

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

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