混淆、散列和加密有什么区别?
以下是我的理解:
- 散列是一种单向算法;无法逆转
- 混淆类似于加密,但不需要任何“秘密”来理解(ROT13 就是一个例子)
- 加密是可逆的,但这样做需要“秘密”
混淆、散列和加密有什么区别?
以下是我的理解:
散列是一种基于较大数据创建半唯一键的技术。在给定的散列中,您最终会发生“冲突”(例如,两个不同的数据计算相同的散列值),当您这样做时,通常会创建更大的散列键大小。
混淆通常涉及尝试删除有用的线索(即有意义的变量/函数名称),删除空格以使事情难以阅读,并且通常以复杂的方式做事以使跟踪正在发生的事情变得困难。它没有像“真正的”加密那样提供严格的安全级别。
加密可以遵循几种模式,其中一种是“秘密”方法,称为私钥加密,其中双方都有一个秘密密钥。公钥加密使用共享的单向密钥进行加密,使用私人收件人密钥进行解密。使用公钥,只有接收者需要知道秘密。
这是一个高级别的解释。我将尝试完善它们:
散列 - 在一个完美的世界中,它是一个随机的预言机。对于相同的输入 X,您总是会收到相同的输出 Y,这与 X 没有任何关系。这在数学上是不可能的(或至少未经证明是可能的)。我们得到的最接近的是陷门函数。H(X) = Y 因为 H-1(Y) = X 很难做到,你最好尝试暴力破解一个 Z 使得 H(Z) = Y
混淆(我的观点) - 任何函数 f,例如 f(a) = b,你依赖 f 是秘密的。F 可能是一个散列函数,但“混淆”部分意味着通过模糊来实现安全性。如果您以前从未见过 ROT13,那将是令人困惑的
加密 - Ek(X) = Y, Dl(Y) = X 其中 E 众所周知。k 和 l 是密钥,它们可能相同(在对称中,它们是相同的)。Y 是密文,X 是明文。
哈希是一种单向算法,用于在不影响参考的情况下将输入与参考进行比较。
它通常用于登录以比较密码,如果您使用信用卡购物,您也可以在收据上找到它。在那里你会找到隐藏了一些数字的信用卡号,这样你就可以很有可能证明你的卡被用来购买东西,而有人在你的垃圾中搜索将无法找到你的卡号.
一个非常天真和简单的哈希是“字符串的前 3 个字母”。这意味着“abcdefg”的哈希将是“abc”。这个函数显然不能反转,这是哈希的全部目的。但是,请注意“abcxyz”将具有完全相同的哈希值,这称为冲突。再说一遍:哈希仅以一定的概率证明两个比较的值是相同的。
另一个非常幼稚和简单的散列是数字的 5 模,在这里你会看到 6、11、16 等......都将具有相同的散列:1。
现代散列算法旨在将冲突的数量保持在尽可能低的水平,但它们永远无法完全避免。一条经验法则是:散列越长,冲突就越少。
密码学中的混淆是在对输入数据进行散列或加密之前对其进行编码。
这使得蛮力攻击不太可行,因为确定正确的明文变得更加困难。
这不是一个糟糕的高级描述。以下是一些额外的注意事项:
散列通常将大量数据减少到小得多的大小。例如,这对于验证文件的内容而无需比较两个副本很有用。
加密涉及存储一些秘密数据,而秘密数据的安全性取决于保持单独的“密钥”免受坏人的侵害。
混淆是隐藏一些没有单独密钥(或使用固定密钥)的信息。在这种情况下,将方法保密是保证数据安全的方式。
从这里,您可以了解哈希算法如何对数字签名和内容验证有用,如何使用加密来保护您的文件和网络连接,以及为什么将混淆用于数字版权管理。
这就是我一直以来的看法。
散列是使用一组算法从另一个值派生出一个值。根据使用的算法,这可能是一种方式,也可能不是。
混淆是通过符号替换使某些东西更难阅读。
加密类似于散列,除了值取决于您提供算法的另一个值。
一个简短的回答:
散列 - 在某些数据上创建一个检查字段(以检测数据何时被修改)。这是一个单向函数,原始数据不能从散列中导出。典型的标准是 SHA-1、SHA256 等。
混淆 - 修改您的数据/代码以混淆其他任何人(没有真正的保护)。这可能会或可能不会丢失一些原始数据。对此没有真正的标准。
加密 - 使用密钥转换数据,以便只有拥有正确密钥的人才能理解它。加密后的数据可以解密得到原始数据。典型的标准是 DES、TDES、AES、RSA 等。
一切都很好,除了混淆与加密并不真正相似 - 有时它甚至不涉及像 ROT13 这样简单的密码。
混淆是隐藏或使某些东西更难理解。
散列接受一个输入,通过一个函数运行它,并生成一个可以作为输入引用的输出。它不一定是唯一的,一个函数可以为不同的输入生成相同的输出。
加密以独特的方式将输入转换为输出。存在一对一的相关性,因此没有潜在的数据丢失或混淆 - 输出始终可以毫无歧义地转换回输入。
散列是从另一个值创建一个值的单向任务。该算法应尝试创建一个尽可能短且唯一的值。
混淆是在不改变语义的情况下使某些东西变得不可读。它涉及到值转换,去除空格等。某些形式的混淆也可以是单向的,因此不可能得到起始值
加密是双向的,总是有一些解密反过来。
所以,是的,你大多是正确的。
混淆只是通过引入技术来混淆某人,从而使某些事情更难理解。代码混淆器通常通过重命名以从变量或方法名称中删除任何有意义的内容来做到这一点。它与加密不同,因为无需解密即可使用。
通常,散列和加密之间的区别在于,散列通常只使用一个公式将数据转换为另一种形式,其中加密使用需要密钥来加密/解密的公式。例如,base 64 编码是一种哈希算法,其中 md5 是一种加密算法。任何人都可以对 base64 编码的数据进行 unhash,但是没有密钥就不能对 md5 加密的数据进行解密。