我在这里有点进退两难。我有一个用户的Drupal7数据库表,以及相应的密码。所有这些密码都是自然加密的。我的假设是这些是MD5散列,但不完全是。
这里的挑战是,我们在一个伙伴网站中使用相同的用户组,该网站使用类似的凭据,但使用不同的技术请不要为此责怪我,我只是一个棋子。
现在,如果我知道Drupal如何加密它的密码,也许我可以解密它们,并在我的后端逻辑中应用相同的密码?
发布于 2012-03-27 03:28:39
请注意,这些密码是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()。
发布于 2014-01-14 15:04:43
您可以使用drupal方法在includes/password.inc中检查该user_check_password($password,$account)的明文密码是否有效。
https://stackoverflow.com/questions/9878289
复制相似问题