将 1 个密码安全地存储在数据库中

Posted

技术标签:

【中文标题】将 1 个密码安全地存储在数据库中【英文标题】:Storing 1 password in database securely 【发布时间】:2019-11-15 12:44:09 【问题描述】:

我有一个 java swing 应用程序,它从登录页面开始,如果登录通过身份验证,应该将管理员带到仪表板。由于只有 1 个管理员,所以只有 1 个用户名和密码组合。

现在,我只是使用简单的插入查询将用户名和密码插入到 sql 表中。 我是新手,所以我不知道该怎么做

create table login (
    Emp_id INT AUTO_INCREMENT PRIMARY KEY,
    Emp_Fname VARCHAR(50),
    Emp_Lname VARCHAR(50),
    Username VARCHAR(50),
    Password VARCHAR(50)
);
insert into login (Emp_id, Emp_Fname, Emp_Lname, Username, Password) values (1, 'TestFName', 'TestLName', 'Test', 'Test');

我希望它加密或散列,而不是以纯文本形式存储密码。

【问题讨论】:

看看这个question 或this one。请注意密码字段的长度必须适合整个哈希,否则您会失去一些机制强度 见How to securely hash passwords? 做一些研究,例如网络搜索java store password 【参考方案1】:

我目前正在用手机打字,请原谅我。您似乎希望您的密码看起来像:eive29ceic28e8c38d9h3ce9h 而不是“password123”

您可以使用 SHA-1 之类的东西,它在 java 中集成了 SHA256 和 SHA512。两者都可以在快速谷歌搜索后找到。我个人在一个项目中使用了它们,但使用一轮的结果作为下一轮的输入,递归地运行了这个方法 100 次。然后我使用这个方案扩展了字符串的长度:密码+密码向后+密码+密码。在我的例子中,密码的长度为 4x512 位,看起来相对安全。 之后我将它保存到一个文件中,每次我想登录时,我都会输入并加密它,然后将它与我文件中的密码进行比较。如果它们与您匹配。我知道您可以破解 sha-1 以蛮力打开它。如果你想要不同的东西,试试 bcrypt、pbkdf2 或 argon2。

我想给你链接,但在移动设备上很难。我希望这对你有用。否则我明天早上评论

编辑:查看您的 cmets 有一个链接到我的意思的算法。只需将其放入 for 循环 100 次...

【讨论】:

按照您的建议将不同形式的密码附加到原始密码不会大大提高安全性,而是使用哈希盐。 确实如此,因为您可能知道:长度每次都胜过复杂性。所以使用我的方法可以帮助延长蛮力的持续时间。如果您需要更多安全性,请自行构建算法以将长度扩展到 10k 或 100k 长度。性能损失更多(最小)但安全性更高

以上是关于将 1 个密码安全地存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 应用程序中安全地存储凭据(密码)?

如何在移动应用程序中安全地存储密码

有没有办法将我的 MySQL 密码安全地存储在 Node.JS 中?

如何提高账户密码存储的安全性——PasswordSalt的使用

如何安全地存储 .pfx 密码以在 MSBuild 中使用?

密码存储中MD5的安全问题与替代方案