MySQL中PASSWORD函数的安全性

信息安全 密码 哈希 mysql
2021-09-01 02:04:06

MySQL中的PASSWORD函数可以翻译成php中的代码:

function mysql_password($string){
    $pass = strtoupper(
            sha1(
                    sha1($string, true)
            )
    );
    $pass = '*' . $pass;
    return $pass;
}

它返回一个 41 个字符的哈希。

我担心这个功能,因为如果我运行:

SELECT PASSWORD('securepassword');

在任何设备上它返回相同的哈希:

*214C2FAF32F109AE748170BFABDDFB9B05889E64

当然,这意味着如果我的数据库遭到破坏,渗透者可以轻松地创建一个包含大量流行密码并匹配哈希值的彩虹表——这难道不是我应该担心的吗?

我希望 PASSWORD 功能对于每个设备都是独一无二的?我将如何让它对每个设备都独一无二?

3个回答

当然,这意味着如果我的数据库遭到破坏,渗透者可以轻松地创建一个包含大量流行密码并匹配哈希值的彩虹表。

那是对的。

哈希值因用户而异。这意味着攻击者可以计算一次哈希值,然后对照所有用户的哈希值进行检查。盐会使这成为不可能。

事实上,哈希值根本没有区别,因此攻击者甚至可以在访问您的系统之前预先计算大量哈希值。

另一个问题是使用的哈希函数(2x SHA1)非常快,暴力攻击可以在短时间内尝试很多密码。使用商品硬件,每秒可以尝试3,000,000,000 个密码

这种密码散列方法不符合现代安全标准。

鉴于没有使用唯一的 Salt,因此对同一字符串应用相同的散列函数每次都会产生相同的结果是正常的(也是非常必要的!!)。

哈希函数根据定义是确定性的

顺便说一句,防止使用 Rainbow Tables 是通过加盐完成的,因为散列字符串总是不同的(应该是唯一的盐)

=====

编辑:为了更彻底地回答实际问题(“每个设备唯一”部分):如果哈希对于每个设备都是唯一的,那么在另一台机器上进行数据库迁移将是不可能的,因为所有哈希将不再匹配 - 在在用于密码的字段的情况下,用户将无法再登录:P 您当然可以想象其他类似的问题(分布式数据库,..)

我希望 PASSWORD 功能对于每个设备都是独一无二的

没有足够的安全算法可供使用 - 通常这是通过每个帐户使用唯一的盐来处理的,但是如果您想要更弱的安全性,我想您可以使用特定于设备的盐。

MySQL支持开箱即用的客户端证书以及插件身份验证器,并且有几个标准可用(包括对Unix PAM的支持)。

(MariaDB 也有相同的 API)