加密 - 它是以这种方式工作的还是我想错了


Encryption - does it work this way or am I thinking wrong?

所以我知道MD5在技术上是新应用程序中的禁忌,但我随机想到了这一点:

因为

md5($password);

不安全,不会

md5(md5($password))

成为更好的选择?我使用它的次数越多,它会变得越来越安全吗?假设我做了这样的函数

function ExtremeEncrypt($password)
{
 $encryptedpass = md5(sha1(md5(md5($pass))));
 return $encryptedpass;
}

这个函数是否是一个很好的选择,比如像 vbulletin 那样为每个帐户使用随机盐。

对字符串进行双重哈希处理,除了限制密钥空间并使冲突更有可能发生外,什么也不做。请不要这样做。双 md5 哈希实际上不如具有某些攻击媒介的单个哈希安全。

更好的选择是使用 php 5.5 中的 password_hash 函数或 ircmaxell 的 password_compat 库用于早期的 php 版本。

首先:哈希和加密是不一样的。哈希是单向函数,而加密期望数据可以解密。

在安全性方面,您不应该尝试发明自己的解决方案。在PHP中,从5.5版本开始,有一个名为密码哈希的本机解决方案。 md5()是不安全的,你应该意识到这一点。

如果你的PHP低于5.5版本,你应该使用盐来散列和存储你的密码。

你在这里有很多答案,它们是准确的,但它们并没有真正解释为什么。

MD5 是一种哈希算法。哈希算法的作用是获取一长段数据并以加密方式对其进行分析,从而创建较小的数据段。因此,从ABCDEFGHIJKLMNOPQRSTUVWXYZ使用我的自定义哈希算法,我可能会创建一个个位数的哈希5

当这样做时,你会丢失信息 - ABCDEFGHIJKLMNOPQRSTUVWXYZ包含的信息比5多得多,并且没有办法以另一种方式进行翻译。

只允许 0-9 的结果(这实际上是校验和)的方式散列的问题在于,如果你拿两段文本,它们具有相同哈希的可能性非常高。所以也许使用我的算法ZZZZZZZZZ也会产生一个5哈希。这就是所谓的哈希冲突

现在,如果我采用哈希的哈希会发生什么?好吧,我的起点已经非常低的信息 - 最多可能是十位数之一,所以现在发生碰撞的可能性非常高。假设当我的哈希算法在数字上运行时,它返回1如果它是奇数,如果它是偶数,则返回0 - 所以如果我有一个5 ABCDEFGHIJKLMNOPQRSTUVWXYZ的哈希值,那么我有 10% 的机会发生碰撞。但是,如果我对该哈希进行哈希处理,我现在将有50%的几率发生碰撞。

密码学的诀窍是将信息隐藏在如此巨大的可能空间中,以至于难以置信地难以找到。您越缩小可能的空间,您的信息隐藏得就越少。

简短回答:

MD5 很容易使用蛮力破解。添加额外的哈希层只会线性减慢暴力攻击的速度。

首先,md5并不是真正的加密,因为它没有解密方法。这称为哈希。

标准做法是加盐您的密码:

$salt = [some random/unique number, people usually use user_id or timestamp]
$hashed_password = sha1($salt . $password)

请记住,您需要知道盐,因此通常这意味着将其与散列密码一起存储。

你可以用多种盐,并按照你喜欢的方式排列它们。