我在这里有点困惑。我有一个用户的Drupal 7数据库表,并带有相应的密码。所有这些密码都被自然加密。我的假设是这些是MD5哈希,但不完全。Drupal 7密码哈希
的这里的挑战是,我们正在利用同一组的用户在使用类似的凭据,但不同的技术配套网站[请不要怪我,这我仅仅是棋子。
现在,如果我知道的Drupal如何去了解它的加密密码,也许我可以对它们进行解密,并采用同样的在我的后端逻辑?
我在这里有点困惑。我有一个用户的Drupal 7数据库表,并带有相应的密码。所有这些密码都被自然加密。我的假设是这些是MD5哈希,但不完全。Drupal 7密码哈希
的这里的挑战是,我们正在利用同一组的用户在使用类似的凭据,但不同的技术配套网站[请不要怪我,这我仅仅是棋子。
现在,如果我知道的Drupal如何去了解它的加密密码,也许我可以对它们进行解密,并采用同样的在我的后端逻辑?
注意,这些密码是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()
。
史诗!谢谢! – user1020069 2012-03-26 19:58:09
显而易见的问题,有人 – user1020069 2012-03-26 21:12:18
答案是正确的,但要解决这个问题,我会先看看其他的可能性。有了drupal ususaly“有一个模块”。例如。 http://drupal.org/project/oauth或核心OpenID模块。 – 2012-06-09 09:35:45
您可以使用drupal方法检查明文密码是否有效,对于这个 user_check_password($ password,$ account)在includes/password.inc中。
我希望Drupal不使用普通的md5。 – CodesInChaos 2012-03-26 19:23:47
你将无法解密它们,但你应该能够以相同的方式对它们进行哈希处理。 – CodesInChaos 2012-03-26 19:24:27
@CodeInChaos我非常怀疑Drupal甚至使用MD5。 – NullUserException 2012-03-26 19:38:58