2010-10-09 77 views
4

我讀過關於使用MySQL AES_ENCRYPT/AES_DECRYPT(雙向加密)比使用PHP不太安全 - 哈希()(單向加密)。PHP和MySQL的安全性:單向加密Vs的雙向加密

http://bytes.com/topic/php/answers/831748-how-use-aes_encrypt-aes_decrypt

這是真的,它是更安全的是「而不是發送用戶他的密碼,只要送他一個鏈接,他可以點擊重置了密碼,而不是」?最重要的是,如果我使用MySQL AES_ENCRYPT/AES_DECRYPT(我非常喜歡...),我該如何定義可以被MySQL接受的密鑰?例如,關鍵的長度是重要的?或者我可以簡單地使用'123123 @ 123123'作爲我的鑰匙?

謝謝!

回答

7

有兩個概念,散列和加密之間的根本區別:
加密可以逆轉,散列不能(至少是這樣的想法)。

如果惡意用戶獲得訪問密碼在數據庫中,並且知道你習慣了加密密鑰,他們將能夠收回說密碼。如果他們被哈希,他們將無法做到這一點。

這就是爲什麼密碼應該總是被哈希(和鹽漬),從來沒有加密。

舉例來說,是關鍵重要的長度是多少?或者我可以簡單地使用'123123 @ 123123'作爲我的鑰匙?

AFAIK MySQL的AES_ENCRYPT可以採取任意長度的密鑰;但很明顯,短鍵將使它更容易被黑客猜解它(即:嘗試所有可能的組合)

1

如果您正在使用對稱加密您的服務器上存儲密碼,你必須解碼存儲的密碼來測試它反對用戶提交的密碼。這意味着密鑰也必須存儲在服務器上。這意味着任何侵害你的Web應用程序的人都可以檢索並解密每個用戶的密碼。 (並使用它們來危害用戶使用相同密碼的其他帳戶。)

散列密碼意味着您不能將密碼泄露給攻擊者,因爲您甚至不知道自己是什麼。您仍然可以通過使用相同的算法和salt對提交的密碼進行哈希處理來檢查提交的密碼是否與原始密碼相同,因此您仍然可以知道提交的密碼是對還是錯,而無需知道密碼是什麼。

使用散列密碼並不代表你不能告訴他們密碼是在「恢復密碼」選項時,用戶。但是,你真的不想那麼做,特別是在電子郵件這種不安全的機制上。一次性,時間限制的重置密碼鏈接服務於相同的目的,並且潛在的損害較小。

1

對於密碼,單向散列幾乎總是要走的路。單向哈希意味着除用戶之外的任何人都能夠知道他們的密碼的可能性要小得多。

如果你選擇了單向路線,那麼你就需要設置一個密碼重置的方法。如果這樣做是正確的,那麼對於大多數目的應該是相當安全的。爲了獲得更好的安全性,您可以添加安全問題(如,「你最喜歡的顏色是什麼?」),用戶在收到電子郵件中的密碼重置鏈接之前必須回答。

至於AES_ENCRYPT/DECRYPT的鍵 - MySQL將接受函數參數key的可變長度,但不管如何,它將使用128位密鑰,所以您最好傳遞至少128位的值。

+0

感謝您的回答,什麼是128位...? – laukok 2010-10-09 16:15:23

2

雙向加密本質上不太安全,因爲真正的數據存儲在某個地方。也就是說,你有一個密碼「你好」。然後你哈希它,你會得到5d41402abc4b2a76b9719d911017c592。這對普通人來說是沒有意義的,他們不知道如何在不知道正確的加密算法的情況下解密它。他們不能使用這個,因爲只使用原始密碼。您通過散列並將其與哈希(也存儲)進行比較來檢查密碼。 5d41402abc4b2a76b9719d911017c592哈希是69a329523ce1ec88bf63061863d9cb14,所以它們不匹配。即使用戶知道哈希密碼,他也無法從中獲取任何信息。

因此,您可以存儲加密的數據,但是如果您在解壓時解密,那麼任何人都可以使用它。

與給他們輸入密碼相比,發送用戶鏈接的安全性是一個不同的問題。如果您通過電子郵件發送密碼,它將以純文本形式打印出來供所有人查看(並使用)。給他們一個鏈接,允許他們輸入一個新的密碼意味着沒有人會看到這是一個更安全一點,但如果有人犯下欺詐可以訪問該鏈接無論如何這將導致問題。

關於AES,我一眼就找不到太多內容,但看起來無所謂加密。所以如果你使用AES_DECRYPT(AES_ENCRYPT('x','b'),'b');它會返回'x'。你必須跟蹤關鍵。

0

單向加密意味着你只能加密。 (例如,您需要對密碼進行加密並存儲結果,每當用戶進行身份驗證時,都會對用戶輸入和比較的內容進行加密,在這種情況下不需要解密功能)。加密方式,既有加密和解密功能。在PHP中,這是通過mcrypt_encrypt()mcrypt_decrypt()函數完成的。