【问题标题】:How to use passwords to protect database data如何使用密码保护数据库数据
【发布时间】:2014-03-20 02:42:09
【问题描述】:

您好,还有一个关于所有数据库/网络专家的新手问题......

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

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

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

最好用一个例子来解释:

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

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

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

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

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

太棒了!!!

【问题讨论】:

    标签: mysql database-administration passwords


    【解决方案1】:
    • 不要使用任何散列函数的单次传递来存储密码。
    • 请务必使用 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) 列,对于 BCrypt 的 192 位可能是 BINARY(24),对于 PBKDF2-的本机输出大小可能是 BINARY(64) HMAC-SHA-512
      • 或者,您可以对 PBKDF2/BCrypt/SCrypt 的二进制输出进行 Base64 编码,但是您必须确保使用区分大小写的比较或在检索后对其进行 Base64 解码
    • 身份验证协议的版本 - 这将是 1,或者可能是 0。
      • 一个 TINYINT UNSIGNED 列
      • 因此,如果您稍后从该方法转移到 NewWellKnownMethod,您可以轻松更改/升级它

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

    • 从数据库中检索他们的版本、盐、迭代计数/工作因子以及生成的哈希
    • 使用数据库中的盐和迭代计数/工作因子对他们刚刚输入的任何关键字/密码进行哈希处理。
    • 将刚刚得到的结果与数据库中的结果进行比较;如果他们是一样的,让他们进来。
      • 高级:使用恒定时间比较,因此如果第一个字节不同,它不会直接退出尝试,以减少对定时攻击的脆弱性。

    对用户进行身份验证后,您需要在某个权限表中查找该用户并确定他们可以做什么,或者使用他们的应用程序级用户名作为应用程序执行的每个查询的参数确保他们只检索自己的数据。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • MD5 已被证明不安全。请不要在新系统中使用它,因为它很容易暴力破解。
      • 为了扩展@YetAnotherUser 提出的观点,它甚至不是老式的蛮力。运行oclHashcat 和“8x AMD R9 290X at stock core clock”的单台计算机每 30 天可以进行超过 8.8 万亿次(带有 Q)的猜测,即每 30 天超过 8.8E15 或不到 2^53 次破解尝试。这些包括基于规则的字典攻击(单词 + 1、单词 + 500、7331 中的单词说话、大写提示、附加字母等)、组合攻击(列表 1 中的单词(用户名)+ 列表 2 中的单词( wordlist)) 等,带掩码的马尔可夫链等。
      猜你喜欢
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多