2012-03-26 236 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中。