2012-07-16 43 views
1

我正在接受培訓以確保登錄過程安全。使用sha256時SQL表中的實際密碼可視化

我在sign_up.php使用SHA 256:

$username= check_input($_POST['username']); 
$password= check_input($_POST['password']); 
//the password is encrypted in sha256 
$secure_sign_up_password = hash('sha256', $password); 

,然後當然在我的SQL數據庫我的用戶表的,我可以讀:

  • 「登錄真正的類型登錄 例如:如果有人類型‘邁克爾’,我會看到‘邁克爾’在SQL數據庫中列

  • ‘密碼’的實際類型化登錄 例如:如果有人輸入「水果」,我會看到在SQL數據庫

我的問題很簡單,但也許有點幼稚(我是新手)散列值,如「e8bfab56c53980cd014206c8da2f8c9b9708eaacc61」:我想我仍然可以在我的數據庫的某個地方讀取實際的密碼,並且散列只用於保護密碼在發送時被攔截和讀取。我永遠不知道,有人可能會要求我給他發送他的真實密碼。但我唯一能看到的就是密碼欄中的'哈希'。

  • 它是這樣做的嗎?
  • 是否有可能將可視化的真實密碼?

回答

2
  1. 千萬不要永遠不要在數據庫中保持開放格式的密碼。如果有人在系統中發現漏洞,他將能夠進行任何sql查詢並獲取用戶密碼。黑客將能夠以用戶身份登錄到系統,因爲他知道用戶名和密碼
  2. 如果用戶想要恢復密碼,請創建用於重新生成密碼的功能。切勿以純文本格式存儲密碼。
  3. SHA256是哈希函數。在數學上它意味着 - 數據只能以一種方式「散列」。我的意思是,從哈希那你不能恢復數據。您可以閱讀有關散列函數http://en.wikipedia.org/wiki/Hash_function以及關於http://en.wikipedia.org/wiki/Sha256 sha256 的結果:如果有人破解您的數據庫並獲取用戶名和密碼,他無法登錄到系統。因爲黑客只有哈希數據,並且無法獲得準確的密碼進行登錄。
  4. 正如我前面提到的,散列函數只能以一種方式「散列」數據。但是一些黑客爲一些預定義的算法構建了大量的大數據。我的意思是,他們建立密碼散列表。這樣的哈希表看起來是這樣的:
 
    password hash 
    ------------------ 
    a   some_hash1 
    b   some_hash2 
    ...   ..... 
    qwerty  some_hash3 
    some_data some_hash3 -- yes, data can have collisions. See wiki about hash functions 

如果黑客入侵你的數據庫,並有這樣的表,他能恢復密碼。例如,黑客獲取管理員用戶散列表「some_hash3」,然後黑客在散列表中搜索這樣的散列,發現散列「some_hash3」具有密碼「qwerty」和「some_data」,黑客將嘗試用這些密碼登錄。 結果:使用鹽。目前黑客擁有6個符號密碼的表格。但是你可以在非常簡單的技巧「吸」出來:當你在數據庫中存儲的密碼,加密碼某些值(鹽),並從該值哈希得到:

// somewhere in code, where creating/updating users password 

$password = hash('sha256', $salt.$password); 

,當你將檢查密碼,請使用相同的邏輯

謝謝

+1

+1 - 這是一個非常豐富的答案。 – Lix 2012-07-16 21:39:17

+0

正式注意!謝謝 – Mathieu 2012-07-17 08:14:10

3

這是設計。 沒有人應該知道我的密碼是什麼,除了我。即使你作爲(在這裏插入花哨的標題)也不應該知道我的密碼。如果我忘記了,那是我的問題,但是您的網站應該爲我提供重置它的方法。然後,當我重置時,您的網站應該再次存儲散列。明文密碼不應該存儲在任何地方。

4

如果你將能夠「解碼」這些密碼,它不會是一個非常安全的系統。一旦有人獲得了進入你的數據庫 - 他們將能夠密碼訪問每個那些沒有他們知道......

如果你曾經忘記了密碼的網站(和我們每個人都有 - 不否認!),你會記得他們通常* 不需要只需發送你的密碼(純文本)作爲提醒你的電子郵件 - 他們會給你機會重置它。通過這種方式(通常通過您的電子郵件/電話號碼進行驗證),他們會知道您的確是開戶人。

*如果他們以純文本形式向您發送密碼,可能意味着他們正在以這種方式或以其他易於解密的形式存儲密碼。這個網站是最有可能不是安全的,因爲他們想客戶所想...


如果您有興趣留下自己各種各樣的「後門」,以便能夠訪問任何用戶帳戶,有什麼你可能認爲這樣做是有從您的管理員帳戶,它允許您使用編碼的密碼登錄裏面一個特殊的登錄表單的。這意味着,您只需離開了hash('sha256', $password)並通過$password已編碼的(你從提取您數據庫)。這有點冒失,如果你已經有一個管理員帳戶,那麼就不會有太多用處,因爲你已經是一個強大的

+1

只是爲了一個小細節釘 - 你可能想使用更強的哈希算法比SHA256這些天。目前流行的觀點是,bcrypt()是要走的路。 – 2012-07-16 20:53:04

+1

這一切都取決於你的應用程序。對於一個簡單的低風險非敏感類型的系統,只需在字符串末尾添加一些鹽就足夠了。更好的安全比抱歉,雖然...你說什麼關於' wiki bcrypt' ... – Lix 2012-07-16 20:56:14

+1

謝謝,現在完全理解。 – Mathieu 2012-07-17 08:12:22

0

sha256哈希和其他哈希是一種方式。見http://en.wikipedia.org/wiki/Cryptographic_hash_function。如果您希望能夠解密您在數據庫的密碼字段中編寫的內容,則可能需要使用其他方法。

您可以使用密鑰進行加密,而不是與用戶共享,而不是創建散列。看看http://www.php.net/manual/en/book.mcrypt.php。密鑰將成爲您的代碼的一部分,因爲它是對稱加密。

要做到真正安全,請嘗試真正的PKI加密(使用公鑰加密,使用私鑰加密)。看看php.net/manual/en/function.gnupg-encrypt.php或php.net/manual/en/book.openssl.php。

但在其他位置都表示,這樣的事情是合理的沒有做;)