我正在尝试创建我的第一个登录页面作为学习练习。
我的计划是使用用户名的盐预先对密码进行哈希处理。将其存储在文本文件中,然后当用户登录时,我将使用相同的盐哈希密码并将结果与文本文件进行比较。
我是一个完整的安全初学者等,所以我不知道这是否安全?小型应用程序的标准是什么?如果不推荐这种方法,那么什么是合适的简单替代方案?
编辑一种可能的解决方案,如果我能让它发挥作用。
String unpwfield;
unpwfield = userId.getText()+passwordfield.getText();
if (BCrypt.checkpw(unpwfield, passwordhash))
System.out.println("It matches");
else
System.out.println(userId.getText()+passwordfield.getText());
答案 0 :(得分:1)
对于密码存储,您将需要使用慢速散列算法。加密哈希速度太快,并且在离线密码猜测中不会减慢攻击者的速度。例如,bcrypt通常是最合适的算法。
Bcrypt会生成自己的盐,因此您无需担心生成这些盐的安全方法。
我会避免使用用户名作为盐。如果多次使用,盐是为了避免使用相同的字节表示存储相同的密码。
原因是如果用户重复使用相同的密码,那么任何具有密码哈希数据可见性的攻击者都会立即明白这一点。此外,如果您的系统是公开可用的,则应用程序的每个实例都将以完全相同的方式存储admin
用户的哈希值,这意味着攻击者将能够使用admin
预先构建彩虹表作为盐。
有关详细信息和指导,请参阅OWASP Cheat Sheet on Password Storage。