我这里有点困境。我有一个drupal 7数据库用户表,带有相应的密码。所有这些密码都是自然加密的。我的假设是这些是MD5哈希,但并不完全。
这里面临的挑战是,我们在使用类似凭据但使用不同技术的配套网站中使用同一组用户[请不要因此而责怪我,我只是一个典当]。
现在如果我知道Drupal如何加密其密码,也许我可以解密它们并在我的后端逻辑中应用它们?
答案 0 :(得分: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()
。
答案 1 :(得分:0)
您可以使用drupal方法检查纯文本密码是否有效 include / password.inc中的user_check_password($ password,$ account)。