你可能已经现在MD5哈希是不是一种安全的方式来存储密码
。如果您知道我们的服务,你可能知道,我们有很多的话一个巨大的数据库,可以在几秒钟内解密
使用的盐,可以可以保护自己免受这种数据库的侵害,但要少得多……
什么是MD5盐及其使用方法?
在密码术中,salt是您添加到输入单词中的随机字符串,以生成不同的哈希值,而单独使用单词时,
MD5并不能真正在密码算法中提供此功能,但是您可以将两个字符串连接起来以获得相同的结果
在这篇文章中,我将向您解释MD5算法中的盐,如何在代码中使用它以及为什么需要使用它
什么是MD5盐?
我已经在引言中给了您答案,但在这里我将给您一个例子
没有MD5盐的数据库
假设您要将用户密码存储在数据库中
通常,您可能希望使用MD5来存储密码
让我们从您的数据库中获取两个用户,它看起来像这样:
用户名 |
密码 |
张三 |
5f4dcc3b5aa765d61d8327deb882cf99 |
李四 |
ab4f63f9ac65152575886860dde480a1 |
使用MD5函数存储密码时的表格如下所示:
如果在cmd5上使用MD5解密工具,您将在一秒钟内找到这些密码是什么
加盐
如果您开始使用盐,则需要将字符串连接到使用密码上,
为此,您有两种选择
对任何用户使用静盐
您可以选择在任何密码之前添加一个静态盐,例如“saltofmd5.cc”,
因此,如果李四密码为“ azerty”,则将加密“saltofmd5.ccazerty”
这是提高安全性的第一步。
就像李四密码是强密码一样,而它是世界上最弱的密码。
你猜怎么着?
在我编写这些行时,相应的MD5不在cmd5数据库中
使用动态盐
如果您始终使用相同的盐,那么攻击者可以找到它,然后使工作变得更轻松
如果他知道他需要在每个密码之前添加“saltofmd5.cc”,则盐将不再有用
为了避免他理解这一点,您可以使用动态盐
,例如,可以将帐户创建日期用作盐:“ azerty20200512”,
甚至更好,可以将帐户创建日期的MD5哈希值用作盐,例如:“ azerty4daa6170a80eab4573d26762ec94ae60”
这是一个基本示例,您必须找到更好的盐,它看起来像一个随机值,但您可以轻松地找到它来生成密码哈希
盐数据库
包含salt的数据库看起来与以前完全相同,
这就是这样做的优势,无论您是否使用salt,攻击者现在都不会立即直接使用,因此攻击者
会尝试不这样做,并且可能永远找不到您的密码
这是一个使用相同密码和静态盐的示例:
为什么您需要在MD5中使用盐?
如何解密MD5?
MD5算法的主要缺点是它的速度快。
您可以在短时间内加密很多单词,
因此每秒可能会尝试很多次,以找到MD5哈希背后的密码
为了解密密码,黑客将使用两种不同的方法:
- 蛮力攻击:每秒进行最大尝试,直到找到单词
- 使用数据库:在数据库中查找单词
如果您想了解有关此MD5解密方法的更多信息,请单击链接以查看我关于该主题的其他帖子。
为什么需要使用盐?
对于这两种方法,密码长度都是他查找解密的哈希值的问题
在蛮力模式下,攻击者可能会以最常见的密码开头,然后再启动字母列表(a,b,...,aa,ab,...)。
我没有每个密码长度所需的当前时间,但是更多最好的字符。因此,如果您添加32个字符加盐,则无论密码大小如何,您都几乎是安全的
使用MD5哈希数据库也是同样的问题。
如果我们不考虑特殊字符,则每个密码字母都有62种可能性:
因此,要生成和存储的总哈希数迅速增加:
- 3个字元的密码:140,608
- 4个字符的密码:7,311,616
- 5个字符的密码:380,204,032个可能性
- 6个字符的密码:19,770,609,664种可能性
- 等等...
这是一个指数函数,
您可能会猜到6个字符的密码比3个字符的密码安全两倍,
但是不,它为每个附加字符增加了更多的可能性
您了解使用30个字符或更多字符的密码时,除了基本短语外,可能没有任何数据库可以提供该信息。
这就是为什么使用salt或至少要求使用长密码是一种好习惯
如何在MD5中加盐?
现在您已经确信这很重要,这是如何做的
实际上,这很容易,您只需要将两个字符串连接在一起
例如,在PHP中,您需要使用点符号来连接两个字符串:
<?php
$salt = "randomstringforsalt";
$password = $_POST['password'];
$md5 = md5($salt.$password);
?>
就是这么简单
不要忘记使用长盐,或者甚至最好使用动态盐
如果盐为“ 1234”,就好像您没有使用盐(azerty或azerty1234是两个弱密码)
结论
就是这样,您现在知道了如何在代码中使用MD5盐,以及为什么要保留MD5加密方法如此重要的原因
但是,如果可以的话,这可能是选择其他算法的最佳选择。
在PHP中,您具有password_hash()函数,或者您也可以使用bcrypt或scrypt在数据库中获取更安全的密码
但是了解什么是盐以及如何使用盐是一件好事,因为您可以将盐与任何加密算法一起使用