0

我正在玩一些项目来学习 MongoDB,而我想要添加的一件事是网站的身份验证机制。

当使用传统的 RDBMS 时,您可以找到大量的库来自动执行许多复杂的身份验证,MongoDB 有什么东西吗?

我正在寻找:

a) 简单且可与 MongoDB 一起使用的东西,或 b) 足够简单的东西,我可以向它输入密码并从中获得合理的哈希值。

那里有类似的东西吗?

注意:我不是在谈论内置的 MongoDB 身份验证。我的意思是我想在一个使用 MongoDB 作为数据存储的网站中构建一个身份验证层。如果一切都失败了,我可以做繁重的工作,只要我有一些关于抽象盐渍/散列的好东西,所以我不必担心把它做好。

4

2 回答 2

1

PHP 已经拥有您需要的散列函数。我更喜欢使用hash_pbkdf2(),但它仅在 PHP 的后期版本中可用。所以我经常使用标准化程度较低的crypt()函数。

它们的工作方式基本相同:您获取密码、算法和一些盐,然后将密码散列多次(数千次)。输出哈希包括进入其中的额外参数(算法、盐和轮数),因此您可以在有人尝试登录时重新创建哈希。

这两种技术的优点是:

  • 您可以选择散列算法
  • 添加随机盐使字典攻击更加困难
  • 额外的散列轮次使蛮力攻击变得更加困难。

我写了一个简短的例子,带有一点单元测试。

/*  Hashes a password using 2000 rounds of SHA-256 and a random salt. 
    Returns a string.
*/
function hashpw($password) {
    $algo = '$5$rounds=2000$'; // specify SHA-256
    $salt = $algo . mt_rand();
    return crypt(strval($password), $salt);
}

/*  Given a password and a hash produced by hashpw(), tells you if the hash
    belongs to the password or not.  
    Returns a boolean. 
*/
function confirmpw($password, $hash) {
    return (crypt(strval($password), strval($hash)) === $hash);
}

$passwords = array(
    'hello world',
    'secret',
    'super-secret',
    'my pets name',
);

foreach($passwords as $onePass) {
    $hash = hashpw($onePass);
    $verified = confirmpw($onePass, $hash) ? 'verified' : 'failed' ;

    echo "$onePass ==> $hash ==> $verified \n";
}
于 2013-06-06T05:25:19.317 回答
0

Codeigniter 有这个:https ://github.com/pawankorotane/mongodb-tank-auth

如果您不使用 CodeIgniter,您可以随时检查代码并针对您使用的框架进行修改。

于 2013-06-06T09:55:41.143 回答