为什么node-ldapauth如此缓慢,即使在缓存时也是如此?

时间:2013-12-11 16:51:00

标签: performance node.js express ldap

我的简单express.js REST-API通过公司范围的LDAP服务器进行身份验证。我正在使用trentm的node-ldapauth module

实际问题是:当我使用一个简单的函数直接比较用户名和密码来提供测试值时,浏览器中的响应大约在8到15毫秒的范围内完成。这包括调用MongoDB获取数据(此测试不多)。

如果我使用ldapauth.authenticate函数,它执行缓存({cache:true}),则需要80到100毫秒。从代码中我只能看到它检查一个LRU缓存,当然第一个请求会慢一点,因为它实际上是在检查LDAP服务器,但是后续的那个?

这是应用程序中的一小段代码:

  process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
  var ldap = new LdapAuth({
    url: config.ldap.url,
    adminDn: config.ldap.adminDn,
    adminPassword: config.ldap.adminPassword,
    searchBase: config.ldap.userBase,
    searchFilter: config.ldap.userFilter,
    cache: true
  });

  app.enable('trust proxy');
  app.use(express.json());
  app.use(express.urlencoded());
  app.use(checkUrl);
  app.use(express.basicAuth(function(user, pass, callback) {
//    if(user === 'samuel' && pass === 'supertest') {
//      callback(null, {name: 'samuel'});
//    } else {
//      callback(new Error("Unauthorized"));
//    }
    ldap.authenticate(user, pass, function(err, user) {
      if(err) {
        console.log("LDAP auth error: %s %s", err, err.dn);
        callback(err);
      }   
      callback(err, user);
    }); 
  }));

任何提示都表示赞赏。

1 个答案:

答案 0 :(得分:1)

这是因为在node-ldapauth下,bcrypt使用bcrypt加密强和缓慢的哈希算法。你实际上希望这发生。散列越慢,黑客反转哈希所需的时间越长。以下链接显示了它的使用位置:

https://github.com/trentm/node-ldapauth/blob/master/lib/ldapauth.js#L338

有关使用{{1}}结帐的详细信息,请参阅此文章:

http://codahale.com/how-to-safely-store-a-password/

当然,作者在那篇文章中提到的一些内容引起了广泛的争论,但是为什么你想要一个缓慢的哈希算法背后的想法是合理的。