2013-12-11 146 views
0

我的简单express.js REST-API通过公司范围的LDAP服务器进行身份验证。我正在使用trentm的node-ldapauth module为什么node-ldapauth如此缓慢,即使缓存?

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

如果我使用缓存({cache:true})的ldapauth.authenticate函数,它需要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

这是因为在封面下,node-ldapauth使用bcrypt密码强和慢的散列算法。你真的希望这件事发生。散列越慢,黑客就需要越长的时间来逆转散列。下面的链接将显示你在哪里它的使用:

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

更多关于为什么要使用bcrypt结帐这篇文章:

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

当然,有些什么笔者文章中提到广泛争论,但为什么你想要一个缓慢的哈希算法的想法是健全的。

+0

非常感谢你对这个很好的解释。我明白其背后的原因,但除了可能对我们的内部应用程序有点矫枉过正之外,时间约束对于此应用程序来说是完全不可接受的。 Java中的'参考实现'只会将返回的用户从LDAP中逐出并每分钟重新进行身份验证,所以不需要任何哈希,因为它不记住密码。我可能需要在这里实现相同的功能。 – smlgbl

相关问题