如何使用密码来保护数据库数据

时间:2014-03-20 02:42:09

标签: mysql database-administration passwords

对于所有数据库/网络专家,你好了另一个新手问题....

我已经阅读了很多关于使用哈希,盐,加密算法等保护存储在数据库中的密码的信息。 为避免混淆,我说有两种不同的密码......'数据库用户名/密码'和'应用程序用户名/密码'其中会有很多。

我认为这是正确的...但由于我的应用程序可能会有很多用户,我不会创建一个 每个人的新数据库用户,而不是他们都可以使用相同的数据库uername /密码来访问数据库本身。选项将是非常严格的。 应用程序帐户设置(用户名和密码)将在数据库的表中加密。

我想知道的是,我是否/如何使用密码来阻止用户阅读数据库中的任何条目。

最好用一个例子来解释:

假设我有一个拥有20个用户的系统。 我将为每个用户分配一个(应用程序)用户名和密码。

每个人都会远程从PC应用程序生成一些数据,然后将其上传到数据库。 表格中的每一行都有一个用户'的参考/列。谁上传了它(以便以后检索)。

假设某人出现(试图破解系统)而不是使用他们自己的用户名开始使用不同的用户甚至执行 其他sql命令读取其他表项。

如何编写应用程序(哪个平台)以确保访问数据库的用户只能访问自己的数据。

我确信开发人员已经多次这样做了,但是如果有人能指出我正确的方向来做一些示例代码或教程 非常感激。

Ta Muchly !!!

2 个答案:

答案 0 :(得分:0)

使用密码的MD5哈希值 - 永远不要存储原始密码。您还可以添加用户名以混淆字典攻击。然后通过任何数据中的user_id字段将数据与用户相关联。保罗......

答案 1 :(得分:0)

  • 不要使用任何散列函数的单次传递来存储密码。
  • 请勿在8-16字节范围内使用随机盐。

相反,您的应用程序让用户选择关键字/密码:

  • 生成加密随机8-16字节盐
  • 将PBKDF2,BCrypt或SCrypt与所述盐一起使用,并使用大型迭代计数/工作因子,因为您的处理器可以处理以创建密码哈希
    • 如果您特定使用PBKDF2,请不要请求比本机散列大小更大的输出(SHA-1 = 20字节,SHA-256为32字节,SHA-384为48字节,SHA-512为64字节) ),或者你增加了攻击者对你的防御者的比较优势。

然后在您的数据库中,您的应用程序会存储该用户的特定内容:

  • 清澈的盐
    • BINARY(8)或BINARY(16)栏
  • 迭代次数/工作系数
    • INT UNSIGNED列
    • 因此您可以在以后轻松更改/升级
  • 产生的密码哈希
    • 对于任何20字节输出长度PBKDF2-HMAC-SHA-x,可能是BINARY(20)列,对于192位BCrypt,可能是BINARY(24),对于PBKDF2的本机输出大小,可能是BINARY(64) - HMAC-SHA-512
    • 或者,您可以对PBKDF2 / BCrypt / SCrypt的二进制输出进行Base64编码,但是您必须确保使用区分大小写的比较或者在检索后对其进行Base64解码
  • 身份验证协议的版本 - 这将是1,或者可能是0。
    • TINYINT UNSIGNED列
    • 因此,如果您稍后从此方法迁移到NewWellKnownMethod,您可以轻松地更改/升级

当用户想要对您的系统进行身份验证时,您:

  • 从数据库中检索他们的版本,盐,迭代计数/工作因子以及结果哈希
  • 使用来自数据库的salt和迭代计数/工作因子来输入他们刚刚输入的任何关键字/密码。
  • 将您刚刚获得的结果与数据库中的结果进行比较;如果他们是相同的,让他们进去。
    • 高级:使用恒定时间比较,因此如果第一个字节不同,它不会只是退出尝试,以减少定时攻击的漏洞。

在对用户进行身份验证之后,您需要在某个权限表中查找该用户并确定允许他们执行的操作,或者将其应用程序级用户名用作应用程序执行的每个查询的参数确保他们只检索自己的数据。

请阅读How to securely hash passwords?,其中Thomas Porrin的答案目前最常被提及Stackexchange密码散列论文,当然是迄今为止我见过的最好的。