加密不可逆吗?


9

我的印象是加密的字符串无法解密,因此原始值将永远丢失。

但是,如果后面的字符串始终等于 “ dominic”(我的名字),那么就不可能有某种逻辑的方式来反转它;因为它不是随机的,也不是基于日期/时间,但是有一种合理的方法吗?

0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=

无论我对“ dominic”(字符串)进行加密的次数是多少,都始终如上。因此,不应该有某种方法来解密这样的字符串吗?

我正在谈论的示例:

public string EncryptPassword(string password)
{
    return Convert.ToBase64String(
        System.Security.Cryptography.SHA256.Create()
        .ComputeHash(Encoding.UTF8.GetBytes(password)));
}

3
您是在谈论名称的加密哈希(通常在密码中使用)吗?或加密(旨在由授权人员解密)?

11
SHA256加密哈希函数,而不是加密算法。它是一种单向功能

1
强制性免责声明:添加哈希值(en.wikipedia.org/wiki/Salt_(cryptography))。此外,SHA256往往速度太快,以至于在使用例如GPU的暴力攻击时不会出现问题。建议使用PBKDF2或scrypt之类的东西。
Maciej Piechotka

7
哈希就像绞肉机。您可以将牛变成碎牛肉,但不能反过来。
尼尔·麦圭根

1
您对公钥/私钥加密感到困惑吗?如果其他人使用您的公共密钥加密邮件,则他不能自己解密该邮件。只有您可以解密-也许是NSA,Mossad,FSB和Tiroler Geheimdienst。
ott--

Answers:


39

加密总是可以反向的。加密的重点是获取一条消息并使用一个秘密密钥对其进行编码,以便只有拥有该密钥的另一个人才能取消加密并读取该消息。

您在这里看到的是散列,它与加密不同,尽管加密技术通常用于实现散列。哈希的想法是,它使用复杂的数学技术来构建映射到旧值(可重复)的新值。没有钥匙,也不意味着可以逆转。使用数学属性创建具有密码学意义的强哈希,如果您拥有A其哈希为value的值B,则有意创建另一个C也哈希为的值非常非常困难B

哈希不需要是可逆的,因为它们用于身份验证。如果您给我一个用户名和密码,您真的不希望我将密码存储在我的数据库中,因为如果有人侵入并获得对我数据库的访问权限,他们可能会保留您的密码!因此,我将密码的哈希存储在数据库中。然后,当您登录时,我检查是否有一个与您的用户名匹配的用户名,并且密码条目与您发送的密码的哈希值相匹配,如果是,则您已通过身份验证,因为创建哈希冲突非常困难(散列为相同值的两个值)和一个良好的散列,因此几乎可以肯定地说,您使用的密码是正确的。

强大的加密哈希的另一个特性是很难逆转。您知道值0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=是“ dominic”的哈希值,因为您已经解决了这个问题,但是如果您不知道该值,也不知道从哪里开始寻找,那么您所拥有的一切就可0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=能使您损失数十亿美元。如果哈希是一个很好的哈希值,则需要数年才能弄清楚原来是“ dominic”。同样,如果密码列表被盗,这对于防止附带损害非常有用。


2
我能否仅列出已知单词并循环浏览,直到找到哈希匹配?这就是为什么网站建议在密码中添加大写字母和数字以使其更安全吗?
user1477388

15
@ user1477388:是的,这正是网站建议这样做的原因。这是攻击哈希密码的一个众所周知的方法:这就是所谓的“字典攻击”,由于显而易见的原因,并使用不在字典是为是对他们的安全..重要的一步的话
梅森惠勒

1
像这看起来有一些很好的洞察力,我的“无法相信,这些不能被以某种方式逆转” security.stackexchange.com/questions/11717/...不,我想/有什么需要扭转他们。我只是好奇。
user1477388 2013年

3
另一个建议是在对每个密码进行哈希处理之前为其添加唯一的内容。一个字符的密码差异将导致完全不同的哈希,即所有哈希结果都是唯一的。否则,如果黑客发现单词“ password123”的哈希,那么他们将知道将其用于具有该特定哈希的所有用户名。听起来您对这种事情有很好的头脑,但是,祝您好运。
Katana314 2013年

1
@MasonWheeler:确实没有必要使用词典中没有的单词,特别是考虑到典型攻击中使用的“词典”与牛津词典完全不同,而是通常已知用于密码的字符串列表。与其尝试避免使用这些单词,不如从2000个左右的单词列表中选择5个随机单词:即使知道了2000单词的字典,这种口令也要花几乎100倍的时间才能破解-力超过8个随机字符总分64
tdammers

9

本质上,您所做的不是“加密”;这是“散列”。两者之间的主要区别在于加密容易逆向(当然使用正确的密钥),而散列被设计成除了首先知道原始消息外,在任何情况下都很难逆转。

从理论上讲,散列模拟“随机预言”,一种具有理想记忆的假设同位元,并且可以生成没有上限范围的完全唯一,完全随机的数字。您会给这个小矮人一个信息,然后会发生以下两种情况之一:或者他以前从未见过该消息,在这种情况下,他会生成一个新的随机数并将其作为摘要提供给您,或者他之前已经看到过此消息,因此他会记住并给您看到该消息时所产生的数字,第一次。在该理论模型中,消息与其摘要之间的关系为零,并且RNG中两次都不会出现单个数字,因此不会发生冲突。

不幸的是,我们没有理想的随机预言。这个想法对于数字实现有实际的可能性,例如oracle能够有效存储和有效地调用任何地方任何人散列的每条消息的能力,以及客户端接受可能是数百或数千个十进制数字的能力在长度上。相反,我们具有哈希函数,该哈希函数是对消息本身进行的不可逆的(单向)数学运算,可以创建确定的转换(相同的消息=>相同的哈希),而没有明显的哈希与原始消息之间的关系。如评论中所述,通过对消息进行系统更改而产生的哈希值也不应有可预​​测的更改;理想情况下,给定消息的单个更改,摘要的每一位将有50%的机会更改。

哈希函数有很多用途;它们被用于质询验证(例如登录凭据,例如密码),而无需双方都知道纯文本秘密,它们被用作校验和,以验证消息是否未被篡改或破坏。它们还用于所谓的“工作量证明”场景中。难以完成但易于验证的计算任务。

如果您曾经找到一种方法来有效地反转SHA256哈希摘要以生成将导致该哈希的消息(任何消息),那么将通过演示证明该哈希实际上已被破坏来证明这一点。实际上,SHA256被认为是安全的,这意味着从哈希摘要开始并产生冲突的消息,无论多么实用,都没有文档化的方法,而这比简单地尝试每种可能性所需的工作要少(对于SHA-256,理想情况是2 ^ 256〜= 10 ^ 77种可能性)。


也可能值得一提的是,在理想的散列函数中,输入中的一位更改应导致输出位的50%更改。称为雪崩效应
CVn

2
@MichaelKjörling:准确地说,人们应该期望每个位以50%的概率发生变化,这与(但暗示)期望平均50%的位发生变化(但暗示)不同。
Dietrich Epp

@DietrichEpp确实,我链接到的Wikipedia文章对此也很清楚,但是最终用户更容易量化两个输入之间更改的位数。
CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.