mysql - 你如何改变mysql中的哈希算法?
问题描述
我刚刚注意到一些我以前没有注意到的关于 MySql 的东西。
如果您使用任何 MySql 散列函数 MD5、SHAx、Password 等,它们似乎都返回相同的散列。这发生在所有模式和数据库中,无论它们安装的实例如何
我有一个本地 MySql 服务器数据库,另外两个由不同的互联网提供商托管
如果我执行以下操作
select MD5('Password');
select Sha1('Password');
select Sha2('Password', 224);
select Password('Password');
每个函数将在所有 MySql 实例中为该函数产生相同的结果
例如,如果我这样做select MD5('Password')
,它会为 MD5 提供相同dc647eb............12b3964
的哈希值,而不管在我的所有服务器上。这在我看来有点可疑,听起来像是一个安全漏洞。
有没有人注意到这一点,有什么可以做的吗?
解决方案
MD5、SHA1 和 SHA2 是简单的加密哈希,对于任何给定的输入,按照设计,它们都会产生完全相同的输出。这就是它们的用途。您不希望每次运行散列时都出现不同的 SHA2 文件签名。它们还旨在快速计算。
您希望SHA2(x)
始终为任何给定生成相同的输出,x
这样如果您有一个文件和一个签名,您可以通过计算哈希并比较它来查看该文件是否以任何方式被篡改。
您可能会想到的密码特定散列(例如Bcrypt )以不同的方式工作并产生随机输出。这使他们更能抵抗暴力密码猜测攻击。它们的设计速度也很慢,通常比它们的 MD5 或 SHA 慢几千万倍,甚至几百万倍。
您希望有效地BCRYPT(x)
对任何给定随机x
且不可预测,因此您无法x
从输出中推断。
是的,使用 MD5 或 SHA 作为密码是一个巨大的安全问题,尤其是在输入未加盐的情况下。只需dc647eb65e6711e155375218212b3964
在您最喜欢的搜索引擎中搜索,看看会出现什么:它会立即“去散列”。您可以将搜索引擎用作以前称为Rainbow Table的东西。
SHA 和 MD5 被广泛用于散列密码,主要是因为它是当时的最佳选择。计算机的速度也慢得多,而且不存在 GPU 选项,因此妥协的风险大大降低。现在存在像Hashcat这样的工具,如果有人粗心使用弱散列,甚至可以破解“困难”的密码。
推荐阅读
- django - 从 Django 数据库模型中获取项目
- react-native - 如何在 react native 中将状态变量设置为组件的属性?
- android - 如何为android和ios的appium自动化运行单一代码结构?
- javascript - After passing the value from JavaScript to C#, how to do some automatic operation with it?
- android - 张量流 LSTM 不起作用
- angular - Nativescript procudes bootstrap: StaticInjectorError(AppModule)[EffectSources -> ErrorHandler]:
- sed - 如何在不使用 sed 在保持空间中插入新行的情况下从模式空间追加到保持空间?
- asp.net-mvc - 选择不按它们被选择的顺序出现 - Select2 js
- node.js - index.ejs 与 index.html
- android - android上的离子运行停止工作