所以,我正在为我的node.js web框架编写一个用户/身份验证系统。
从可用性或安全角度来看,我应该关注哪些边缘情况?
答案 0 :(得分:7)
密码必须使用单向散列算法在数据库中进行散列。这使您不必知道他们的密码。选择正确的算法很重要。由于多个漏洞,MD5被认为是不安全的。事实证明SHA1不像MD5那样不安全,但它在理论上被认为是弱的。最好转换到SHA2或SHA256。截至2010年底,政府要求使用SHA2。
http://en.wikipedia.org/wiki/MD5
密码应该是盐渍的。这可以防止字典攻击您的密码。通过组合随机信息意味着攻击者无法获取大量单词并逐个尝试查看系统中的哈希值。
http://en.wikipedia.org/wiki/Salt_(cryptography)
密钥加强有助于打击弱密码,因为弱密码会损害系统的安全性。您可以使用哈希算法迭代几次1000次,以提高强制密码的复杂性。
http://en.wikipedia.org/wiki/Key_strengthening
确保您的用户通过https为Web应用程序提交登录信息。否则他们会以明文形式提交密码。不要尝试使用Javascript聪明。只需使用https即可完成。
您必须权衡可用性与隐私。使用电子邮件地址而不是用户名是非常好的,因为它很容易记住,但如果你有一个社交网站,人们不会喜欢你发布他们的电子邮件地址。有时接受用户名或电子邮件地址很好。
您需要考虑的另一件事是您的用户将如何保持登录系统。会话,cookie等会话很容易,但如果您的网站有数百万用户,它们会变得昂贵。您可以使用memcache或Java中过多的分布式缓存来存储它们。但是,其他替代方案正在使用HMAC。请记住,与单向哈希不同,HMAC有一个必须在您的服务器上受到保护的私钥。如果您选择使用HMAC + cookie来识别用户,请采取措施以某种形式的对称加密来保护私钥。还有一个下降死亡日期,HMAC不能过去使用。 HMAC应该只在固定的时间内有效。您的软件必须强制执行。不要依赖cookie超时来为你做这件事。
要考虑的其他事项是使用OpenID,因为它确实可以帮助您的用户访问您的网站,而无需通过注册过程。我有一个Android应用程序,我不提前要求帐户,但如果他们选择使用某些功能我要求他们注册。而且,不强迫用户登录,用户保留率会高得多。人们在注册过程中会丢失。
确保您的应用程序中的方法强制某人在执行之前进行身份验证。在调用方法之前,您需要有一种方法强制所有方法调用通过应用程序的一部分,如果未经过身份验证,则将它们重定向到登录。尝试并记住他们要去的页面。
还有其他人,但我不完全确定这是你正在寻找的。祝你好运,谷歌在安检方面做一些研究是值得的。
答案 1 :(得分:1)
常见边缘情况: