登录 ID 和密码是否应该存储在单独的表中

Bas*_*sit 5 database-design sql-server

我正在研究我的学术项目。我有一个员工记录表,其中包含员工 ID、加入日期、职务和其他字段。我正在尝试实现一个方案,其中当第一次在数据库中添加员工记录时,将生成用户名和临时密码,以便新员工可以使用它登录数据库以查看他的详细信息。我想问一下,将登录 ID 和密码保存在员工记录表中是否是一个好习惯?或者我应该单独存储它们,但后来我想我无法在将员工数据插入数据库时​​生成临时密码和ID。或者还有其他方法可以实现这个方案吗?

编辑:我知道我永远不应该在数据库中保存明文密码,而应该使用盐/哈希。不过,我正在寻找一种可以通过一个操作完成上述任务的方法,即如果我为用户 ID 和密码创建一个单独的表,那么我如何能够在员工表中输入员工详细信息并为用户生成用户 ID/密码并通过一个操作从单独的表中存储。

Dan*_*man 6

从数据库设计的角度来看,我通常建议使用单独的表来存储身份验证凭据。该表可以包含适用于登录本身而不是员工的附加属性(例如密码到期日期),并且避免需要在每个员工表查询中携带该包袱。

另外,我强烈建议您永远不要在数据库中存储用于应用程序身份验证的密码。相反,存储加盐的密码哈希值。这样更安全,因为即使数据库遭到破坏,也无法检索明文密码。


RLF*_*RLF 4

无论您使用一个表还是两个表,您都应该能够在单个事务中插入所需的所有数据。

更重要的是,您不应该存储密码,而应该存储密码哈希值。这是一篇关于使用密码哈希的帖子,例如 SQL Server 本身使用的密码哈希。这是使用带有 32 位盐的 SHA_512 哈希。

http://sqlity.net/en/2460/sql-password-hash/

这样您就永远不会存储实际的密码。创建密码时,您需要与新用户共享密码。最好强制他在第一次使用时更改密码。

当然,每次创建新密码时,您都必须更新哈希以匹配当前密码。这意味着您必须管理所有密码更改,而不仅仅是初始密码。

编辑回复:“我如何能够在员工表中输入员工详细信息,并为用户生成用户 ID/密码,并通过一个操作从单独的表中存储。”

您必须在事务中完成该工作。下面是使用 3 个存储过程的粗略轮廓。当然,你需要编写实际的代码:

BEGIN TRANSACTION; 
   EXEC InsertNewUser @Name='UserName', ... , @NewUserId INT OUTPUT; 
   EXEC CreateNewUserPassword @UserID=@NewUserID, ..., @Password NVARCHAR(128) OUTPUT;
   EXEC SendPasswordToNewUser @NewUserID, @Password; 
COMMIT TRANSACTION; 
Run Code Online (Sandbox Code Playgroud)

通过收集新的 @UserID 和 @Password 值,您可以在以下步骤中使用它们。