2012-03-26 237 views
2

我在這裏有點困惑。我有一個用戶的Drupal 7數據庫表,並帶有相應的密碼。所有這些密碼都被自然加密。我的假設是這些是MD5哈希,但不完全。Drupal 7密碼哈希

的這裏的挑戰是,我們正在利用同一組的用戶在使用類似的憑據,但不同的技術配套網站[請不要怪我,這我僅僅是棋子。

現在,如果我知道的Drupal如何去了解它的加密密碼,也許我可以對它們進行解密,並採用同樣的在我的後端邏輯?

+2

我希望Drupal不使用普通的md5。 – CodesInChaos 2012-03-26 19:23:47

+1

你將無法解密它們,但你應該能夠以相同的方式對它們進行哈希處理。 – CodesInChaos 2012-03-26 19:24:27

+0

@CodeInChaos我非常懷疑Drupal甚至使用MD5。 – NullUserException 2012-03-26 19:38:58

回答

6

注意,這些密碼是hashed,沒有加密。哈希和加密之間的根本區別在於,使用加密,您將能夠恢復原始密碼。當它們被散列時(不是沒有很多努力),你就無法做到這一點,這是設計。

土豆煎餅的想:如果你已經有了一個哈希棕色,你將無法得到原始土豆回來。這樣做是爲了防止黑客破壞系統並獲得對數據庫的訪問權限,從而無法查看或恢復原始密碼。

那麼如何檢查用戶是否輸入了正確的密碼?那麼,當用戶嘗試登錄並輸入密碼時,就會將相同的函數應用於用戶輸入,並查看輸出是否與存儲在數據庫中的內容相同。由於哈希函數爲deterministic,因此您將始終使用相同的輸入獲得相同的輸出。

的關鍵,越來越多的應用程序使用相同的散列工作是有試圖驗證用戶時,他們使用的密碼相同的功能。 Drupal可能也會使用一個或多個salts - 但這並不重要。只要應用程序使用相同的邏輯,散列將始終完全兼容。

假設Drupal使用這樣的事情作爲其身份驗證系統(非常簡化的僞代碼雜交):

/* 
    input: user-entered $username and $password 
    output: true if authorized, false otherwise 
*/ 
function auth($username, $password) 
{ 
    $salt = 'some random salt'; 

    // input is sanitized somewhere, somehow 
    $hash_from_db = db_result('SELECT hash FROM users WHERE username = "$username"'); 
    $hashed_input = sha1($password . $salt); 

    if ($hash_from_db != $hashed_input) 
     return false; 
    else 
     return true; 
} 

如果您的其他應用程序使用同樣的事情到它的用戶進行身份驗證,它會正常工作。請注意,Drupal的身份驗證方案可能會複雜得多,但不要讓這讓你感到困惑。這只是關於做Drupal所做的同樣的事情。


爲Drupal,這裏的地方就可以開始:user_hash_password()

+0

史詩!謝謝! – user1020069 2012-03-26 19:58:09

+0

顯而易見的問題,有人 – user1020069 2012-03-26 21:12:18

+0

答案是正確的,但要解決這個問題,我會先看看其他的可能性。有了drupal ususaly「有一個模塊」。例如。 http://drupal.org/project/oauth或核心OpenID模塊。 – 2012-06-09 09:35:45

0

您可以使用drupal方法檢查明文密碼是否有效,對於這個 user_check_password($ password,$ account)在includes/password.inc中。