使用 "in-database" 设计的身份验证管理

Authentication management using "in-database" design

我想讨论好主意还是坏主意:

我得到了一个 MySQL 数据库并创建了一个通用 table“用户”来验证登录。

|User|
|user_id|username|password|created_at| 

我实现了一个存储函数和一些触发器。

首先:

ON BEFORE UPDATE

将在 password 更改时生成 SHA256 哈希和盐。 盐是由 created_atuser_id 和存储在另一个“config-table”中的全局​​ salt_mod 混合生成的。

因此,当通过正常更新在“密码”中输入 123 时,它将生成用户唯一的密码和盐哈希值。

接下来我实现了一个存储函数

checkUserAuth('username', 'password') 

returns: bool 真或假

当然:接收 PLAIN 用户名和密码,复制相同的哈希逻辑和 returns bool "true" 或 "false",取决于凭据是否正确。

专业人士:

魂斗罗:

上面场景的问题:

Is this a good approach or totally vulnerable in point of data-security? 

我的意思是,一方面,数据库内部的入侵总是一个不应该发生的问题

另一方面,即使应用程序的源代码被窃取或数据库帐户被应用程序中的错误窃取,您也无法窃取任何与登录相关的数据。

根帐户当然被排除在其他地方然后在 localhost/server 上使用。

你怎么看这个?

主要弱点是您在创建行时以及每次调用 checkUserAuth() 函数时以明文形式传递密码。

这可以被窃听(除非您确保在应用程序和数据库之间使用 SSL 连接),如果您启用了查询日志,它将被写入查询日志。它在进程列表和 performance_schema 语句历史表中也可见。

这是在客户端进行散列的一个很好的理由,并且在您创建行时只发送密码的加盐散列。当您进行身份验证时,从数据库中获取加盐哈希,并根据客户端中的用户输入对其进行验证。