请注意,这些密码是hashed http://en.wikipedia.org/wiki/Hash_function,未加密。散列和加密之间的根本区别在于,通过加密,您将能够恢复原始密码。当它们被散列时你将无法做到这一点(不是没有很多努力),这是设计使然的。
想想土豆煎饼:如果你做了土豆煎饼,你将无法恢复原来的土豆。这样做的目的是,如果黑客危害您的系统并获得对数据库的访问权限,他们将无法查看或恢复原始密码。
那么如何检查用户输入的密码是否正确呢?那么,当用户尝试登录并输入密码时,您可以对用户输入应用相同的函数,并查看输出是否与数据库中存储的内容相同。由于散列函数是确定性的 http://en.wikipedia.org/wiki/Deterministic_algorithm,您将始终使用相同的输入获得相同的输出。
让多个应用程序使用相同的哈希值的关键是让它们在尝试对用户进行身份验证时对密码使用相同的函数。 Drupal 可能也使用一种或多种salts http://en.wikipedia.org/wiki/Salt_%28cryptography%29-但这并不重要。只要您的应用程序使用相同的逻辑,哈希值将始终完全兼容。
假设 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() http://api.drupal.org/api/drupal/includes!password.inc/function/user_hash_password/7.