我应该在哪里散列用户密码,在Web服务器应用程序中还是在数据库中?(赞成和反对)
我正在尝试创建一个网站,该网站具有将用户注册为Oracle数据库和JavaEE+Tomcat服务器应用程序的功能。
我阅读了关于散列密码的不同技术和建议,并为每个用户添加了唯一的salt。
我发现Java和Oracle中都有这样的工具:
1) 甲骨文:https://oracle-base.com/articles/9i/storing-passwords-in-the-database-9i
2) Java:http://howtodoinjava.com/security/how-to-generate-secure-password-hash-md5-sha-pbkdf2-bcrypt-examples/
所以我可以用两种方法解决这个问题:
1)在web应用程序中散列密码,并通过JDBC连接发送到数据库散列值
2) 将密码以明文形式发送到数据库,并使用Oracle DBMS_CRYPTO包在其中执行哈希运算
我已经尝试过搜索这个主题,但我发现的只是关于使用JavaScript的客户端哈希与不强调数据库与web应用程序部分的服务器端哈希的问题
也许没有确切的答案,请告诉我: 这些解决方案有哪些优点和缺点?使用第一个或第二个可以面对哪些问题
# 1 楼答案
如何散列:
不要加密密码。用随机盐在HMAC上迭代大约100毫秒(盐需要与散列一起保存)。使用诸如password_hash、PBKDF2、Bcrypt等函数和类似函数。重点是让攻击者花费大量时间用暴力寻找密码
根据上面的散列方法,salt、迭代和版本将使用散列密码保存,或者这需要在代码中完成
请参阅OWASP(开放式Web应用程序安全项目)Password Storage Cheat Sheet
见证券交易所How to securely hash passwords, The Theory