2013-12-11 143 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

相關問題