使用 "in-database" 设计的身份验证管理
Authentication management using "in-database" design
我想讨论好主意还是坏主意:
我得到了一个 MySQL 数据库并创建了一个通用 table“用户”来验证登录。
|User|
|user_id|username|password|created_at|
我实现了一个存储函数和一些触发器。
首先:
ON BEFORE UPDATE
将在 password
更改时生成 SHA256 哈希和盐。
盐是由 created_at
、user_id
和存储在另一个“config-table”中的全局 salt_mod 混合生成的。
因此,当通过正常更新在“密码”中输入 123 时,它将生成用户唯一的密码和盐哈希值。
接下来我实现了一个存储函数
checkUserAuth('username', 'password')
returns: bool 真或假
当然:接收 PLAIN 用户名和密码,复制相同的哈希逻辑和 returns
bool "true" 或 "false",取决于凭据是否正确。
专业人士:
- 这使得密码算法更改的完全同步对于任何连接的应用程序来说都已过时。
- 应用程序正在使用的数据库帐户可以在没有“用户名”、“密码”和“salt”权限的 SELECT 权限的情况下工作。
- 即使数据库的用户帐户被盗,由于缺乏读取 FUNCTIONS 源代码和存储登录信息的列的权限,密码仍然是安全的。我们这里只有EXECUTE权限。
魂斗罗:
- 好吧,如果有人以 root 权限闯入数据库,几乎所有关于“如何生成散列”的源代码(几乎是加盐公式)连同所有信息一起泄露在一个地方。然而,由于 created_at 日期和 user_id 与 global_salt.
的独特散列,它仍然很难彩虹-table
上面场景的问题:
Is this a good approach or totally vulnerable in point of data-security?
我的意思是,一方面,数据库内部的入侵总是一个不应该发生的问题
另一方面,即使应用程序的源代码被窃取或数据库帐户被应用程序中的错误窃取,您也无法窃取任何与登录相关的数据。
根帐户当然被排除在其他地方然后在 localhost/server 上使用。
你怎么看这个?
主要弱点是您在创建行时以及每次调用 checkUserAuth() 函数时以明文形式传递密码。
这可以被窃听(除非您确保在应用程序和数据库之间使用 SSL 连接),如果您启用了查询日志,它将被写入查询日志。它在进程列表和 performance_schema 语句历史表中也可见。
这是在客户端进行散列的一个很好的理由,并且在您创建行时只发送密码的加盐散列。当您进行身份验证时,从数据库中获取加盐哈希,并根据客户端中的用户输入对其进行验证。
我想讨论好主意还是坏主意:
我得到了一个 MySQL 数据库并创建了一个通用 table“用户”来验证登录。
|User|
|user_id|username|password|created_at|
我实现了一个存储函数和一些触发器。
首先:
ON BEFORE UPDATE
将在 password
更改时生成 SHA256 哈希和盐。
盐是由 created_at
、user_id
和存储在另一个“config-table”中的全局 salt_mod 混合生成的。
因此,当通过正常更新在“密码”中输入 123 时,它将生成用户唯一的密码和盐哈希值。
接下来我实现了一个存储函数
checkUserAuth('username', 'password')
returns: bool 真或假
当然:接收 PLAIN 用户名和密码,复制相同的哈希逻辑和 returns bool "true" 或 "false",取决于凭据是否正确。
专业人士:
- 这使得密码算法更改的完全同步对于任何连接的应用程序来说都已过时。
- 应用程序正在使用的数据库帐户可以在没有“用户名”、“密码”和“salt”权限的 SELECT 权限的情况下工作。
- 即使数据库的用户帐户被盗,由于缺乏读取 FUNCTIONS 源代码和存储登录信息的列的权限,密码仍然是安全的。我们这里只有EXECUTE权限。
魂斗罗:
- 好吧,如果有人以 root 权限闯入数据库,几乎所有关于“如何生成散列”的源代码(几乎是加盐公式)连同所有信息一起泄露在一个地方。然而,由于 created_at 日期和 user_id 与 global_salt. 的独特散列,它仍然很难彩虹-table
上面场景的问题:
Is this a good approach or totally vulnerable in point of data-security?
我的意思是,一方面,数据库内部的入侵总是一个不应该发生的问题
另一方面,即使应用程序的源代码被窃取或数据库帐户被应用程序中的错误窃取,您也无法窃取任何与登录相关的数据。
根帐户当然被排除在其他地方然后在 localhost/server 上使用。
你怎么看这个?
主要弱点是您在创建行时以及每次调用 checkUserAuth() 函数时以明文形式传递密码。
这可以被窃听(除非您确保在应用程序和数据库之间使用 SSL 连接),如果您启用了查询日志,它将被写入查询日志。它在进程列表和 performance_schema 语句历史表中也可见。
这是在客户端进行散列的一个很好的理由,并且在您创建行时只发送密码的加盐散列。当您进行身份验证时,从数据库中获取加盐哈希,并根据客户端中的用户输入对其进行验证。