数据库中的登录名和密码存储

Posted

技术标签:

【中文标题】数据库中的登录名和密码存储【英文标题】:Login & Password storage in databases 【发布时间】:2021-03-02 04:46:56 【问题描述】:

我正在创建一个简单的聊天,我想添加用户登录功能。

我有一个问题:我应该将登录名和密码 (hash+salt) 存储在与消息和其他聊天内容相同的数据库中,但存储在不同的表中,还是有更好的方法为其创建另一个数据库?

请告诉我如何以及为什么。非常感谢

【问题讨论】:

【参考方案1】:

通常,用户表是与您存储其他信息相同的数据库的一部分。重要的是,它应该只包含密码的加盐哈希,这与加密密码不同。还必须存储盐,以便在用户想要登录时重现相同的哈希。

密码哈希函数将生成一个包含密码哈希和随机盐的字符串(每个密码应该不同)。该字符串可以存储在数据库中。合适的密码哈希函数是 Argon2、BCrypt、SCrypt 和 PBKDF2,其他哈希函数如 MD5、SHA* 不应该使用,因为它们太快了。

如果您正在寻找更多信息,请查看我关于 safely storing passwords 的教程。

【讨论】:

【参考方案2】:

我应该将登录名和密码(hash+salt)与消息和其他聊天内容存储在同一个数据库中,但存储在不同的表中吗?

是的,如果它们在同一个数据库中,它们必须在另一个表中,例如“user”。例如,您将有一个名为 users 的表和一个名为 message 的表。 密码必须像您拥有的任何其他敏感数据一样加密。 例如:消息是私密的吗?可能。所以他们最好加密。您不希望拥有数据库访问权限的人阅读所有聊天记录。

或者有没有更好的方法为它创建另一个数据库?

如果您的系统架构是微服务,那么您的登录/用户数据很有可能应该在另一个数据库中。这将意味着数据重复,但更易于维护。但是,这实际上取决于您的系统设计。对于非常小的应用程序,我不会使用微服务,除非您期望应用程序在某个时候增长,新功能......等等。

【讨论】:

【参考方案3】:

对我来说,盐更像是一个给散列函数的环境变量。但是你为什么要储存盐呢?

【讨论】:

以上是关于数据库中的登录名和密码存储的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地存储用户信息和用户登录名和密码

将公钥添加到 gitlab 后仍然 cli 需要登录名和密码

sqlserver登录名和用户名的区别和联系

在 SQL Server Management Studio 中删除记住的登录名和密码列表

如何在应用程序中保存用户登录名和密码

如何将 Web 应用程序的登录名和密码数据传递到桌面应用程序而不造成任何安全风险