2012-06-06 52 views
0

我做了一個登錄和註冊頁面。但我的密碼尚未加密。人們告訴我這是一個壞主意,我應該加密它們。所以我一直在尋找如何加密和解密我的密碼。我找到了一個關於如何加密我的密碼的例子,但我不知道如何再次解密我的登錄頁面。這裏是我的加密代碼:如何使用mcrypt解密

$key = "some random security key"; 
$input = $password; 

$td = mcrypt_module_open('tripledes', '', 'ecb', ''); 
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
mcrypt_generic_init($td, $key, $iv); 
$password = mcrypt_generic($td, $input); 
mcrypt_generic_deinit($td); 
mcrypt_module_close($td); 

所以我的問題是:誰能告訴我,我需要解密串,我從上面的代碼中得到什麼碼。

+0

除非您有一個有效的用於將密碼恢復爲純文本的用例,否則加密不是一種好的方法。研究哈希,它更容易,更快速,並且不易出錯。在這裏查看哈希密碼的一個很好的描述:http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html –

回答

0

我看到你對這是如何工作有點困惑。閱讀本文,您將瞭解加密,解密,散列及其在登錄系統中的使用。 http://net.tutsplus.com/tutorials/php/understanding-hash-functions-and-keeping-passwords-safe/

因此,基本上,您在註冊時將密碼散列成十六進制字符串並將其存儲在數據庫中。每次用戶想要登錄時,都會獲取他當前的I/P密碼,並將其存儲在像$ temp這樣的變量中。

現在,您從服務器檢索原始密碼的散列,並簡單比較兩個散列。

...如果他們是相同的,然後訪問授予!是

你不想保持加密和解密密碼的原因是多方面的,如下所示:

  • 當被傳遞到用戶輸入的密碼以純文本 或很容易被偷走的服務器/嗅了嗅。
  • 服務器必須在每次需要時計算存儲在數據庫中的密碼的解密過程,而不是在我們只進行邏輯比較的情況下進行散列。
  • 如果包含加密算法的文件在數據庫中受到損害,則所有密碼都將以純文本形式丟失。由於用戶可能在多個站點上使用相同的密碼 ,威脅會擴展。
0

您不應該嘗試解密密碼只是比較哈希密碼。

順便說一句,如果你以正確的方式做到這一點,不可能恢復原來的密碼。你還應該添加一個所謂的salt來使密碼更復雜。

5

您可以加密和解密的東西是這樣的:

//this is some config for a good security level of mcrypt 
define('SAFETY_CIPHER', MCRYPT_RIJNDAEL_256); 
define('SAFETY_MODE', MCRYPT_MODE_CFB); 

//this has to be defined somewhere in the application. 
define('APPLICATION_WIDE_PASSPHRASE', 'put-something-secure-here'); 
define('ENCRYPTION_DIVIDER_TOKEN', '$$'); 

//some "example" data as if provided by the user 
$password = 'this-is-your-data-you-need-to-encrypt'; 

//this key is then cut to the maximum key length 
$key = substr(md5(APPLICATION_WIDE_PASSPHRASE), 0, mcrypt_get_key_size(SAFETY_CIPHER, SAFETY_MODE)); 

//this is needed to initialize the mcrypt algorythm 
$initVector = mcrypt_create_iv(mcrypt_get_iv_size(SAFETY_CIPHER, SAFETY_MODE), MCRYPT_RAND); 

//encrypt the password 
$encrypted = mcrypt_encrypt(SAFETY_CIPHER, $key, $password, SAFETY_MODE, $initVector); 

//show it (store it in db in this form 
echo base64_encode($initVector) . ENCRYPTION_DIVIDER_TOKEN . base64_encode($encrypted) . '<br/>'; 

//decrypt an show it again 
echo mcrypt_decrypt(SAFETY_CIPHER, $key, $encrypted, SAFETY_MODE, $initVector) . '<br/>'; 

但如前所述,密碼不應該從他們的混編方式表示的恢復,所以不要爲密碼做到這一點!

+0

應該保存'$ initVector'以便能夠解密加密的值? – Piero

+0

是的,它必須存儲在數據的某個地方,還有一些關於http://stackoverflow.com/questions/5108607/encryption-use-of-initialization-vector-vs-key的討論 – Michael