我正在尝试创建一个网站,该网站具有将用户注册为Oracle作为数据库并将JavaEE + Tomcat注册为服务器应用程序的功能。
我阅读了有关散列密码的不同技术和建议,并为每个用户使用独特的盐进行盐化。
我发现Java和Oracle都有工具可以做到这一点:
1)Oracle: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应用程序部分。
也许没有确切的答案,所以,请告诉我: 这些解决方案有哪些优点和缺点?使用第一个或第二个可以面对哪些问题?
答案 0 :(得分:1)
如何哈希:
不加密密码。使用随机盐在HMAC上迭代大约100ms的持续时间(盐需要用散列保存)。使用password_hash,PBKDF2,Bcrypt等功能。重点是让攻击者花费大量时间通过暴力破解密码。
根据上面的散列方法,盐,迭代和版本都会使用散列密码保存,或者需要在代码中完成。
请参阅OWASP(开放式Web应用程序安全项目)Password Storage Cheat Sheet。
请参阅Security Stackexchange上的How to securely hash passwords, The Theory。