哈希函数与加密最大不同

更新时间:01-27 教程 由 忘爱。 分享

哈希函数与加密最大不同?

哈希函数

它们提供任意长度输入和(通常)固定长度(或较小长度)输出之间的映射 . 它可以是从简单的crc32到完整的加密散列函数,如MD5或SHA1 / 2/256/512 . 重点是正在进行单向映射 . 它总是很多:1映射(意味着总会有碰撞),因为每个函数产生的输出都比输入能力小(如果你将每个可能的1mb文件输入到MD5中,你会得到大量的碰撞) .

他们很难(或实际上不可能)扭转的原因是因为他们在内部的工作方式 . 大多数加密散列函数多次迭代输入集以产生输出 . 因此,如果我们查看每个固定长度的输入块(这取决于算法),哈希函数将调用当前状态 . 然后它将遍历状态并将其更改为新状态并将其用作自身的反馈(MD5为每个512位数据块执行64次此操作) . 然后它以某种方式将来自所有这些迭代的结果状态组合在一起以形成结果散列 .

现在,如果你想解码哈希,你需要为每个状态反转迭代 . 现在,为了解释为什么这很难,想象一下从下面的公式中推断 a 和 b : 10 = a + b . a 和 b 有10种正面组合可以使用 . 现在循环多次: tmp = a + b; a = b; b = tmp . 对于64次迭代,你只是一个简单的加法,其中一些状态从迭代到迭代保留 . 实际散列函数执行的操作多于1次(MD5对4个状态变量执行大约15次操作) . 并且由于下一次迭代取决于前一次的状态,而前一次迭代在创建当前状态时被破坏,如果您对输入的大小有所了解,那么它实际上要大大降低哈希强制哈希值(对于较小的输入)而不是甚至尝试解码哈希 .

加密功能

它们在任意长度的输入和输出之间提供1:1映射 . 而且他们总是可逆的 . 需要注意的重要一点是,使用某种方法是可逆的 . 对于给定的密钥,它总是1:1 . 现在,有多个输入:密钥对可能会生成相同的输出(实际上通常有,具体取决于加密函数) . 良好的加密数据与随机噪声无法区分 . 这与良好的散列输出不同,散列输出始终是一致的格式 .

用例

如果要比较值但不能存储普通表示(出于多种原因),请使用哈希函数 . 密码应该非常适合这种用例,因为出于安全原因(不应该),您不希望将它们存储为纯文本 . 但是如果你想检查一个文件系统是否有盗版音乐文件怎么办?每个音乐文件存储3 MB是不切实际的 . 所以相反,取出文件的哈希值并存储(md5将存储16个字节而不是3mb) . 这样,你只需散列每个文件并与存储的哈希数据库进行比较(由于重新编码,更改文件头等等,这在实践中不起作用,但这是一个用例示例) .

当你设计它们时,使用哈希函数 . 如果您有2个输入,并想要检查它们是否相同,则通过哈希函数运行 . 对于小输入大小,碰撞的概率是天文数字低(假设具有良好的散列函数) . 那个's why it'建议用于密码 . 对于最多32个字符的密码,md5的输出空间是4倍 . SHA1的输出空间是大约6倍(大约) . SHA512的输出空间约为16倍 . 你真的不在乎密码是什么,你关心它是否应该使用哈希密码 .

无论何时需要取回输入数据,都要使用加密 . 注意单词 need . 如果你想要将它们存储为纯文本 . 因此,存储加密版本并尽可能保持密钥安全 .

散列函数也非常适合签名数据 . 例如,如果您正在使用HMAC,则通过获取与已知但未传输的值(秘密值)连接的数据的哈希值来签署一条数据 . 因此,您发送纯文本和HMAC哈希 . 然后,接收器简单使用已知值散列提交的数据,并检查它是否与传输的HMAC匹配 . 如果它是相同的,你知道它没有被没有秘密值的一方篡改 . 这通常用于HTTP框架的安全cookie系统,以及HTTP上数据的消息传输,您希望在数据中保证完整性 .

关于密码哈希的注释:

加密哈希函数的一个关键特性是它们应该非常快速地创建,并且很难/慢速地反转(以至于它实际上是不可能的) . 这会造成密码问题 . 如果存储 sha512(password) ,则攻击者只需通过哈希函数运行字典并测试每个结果即可 .

添加盐有助于解决问题,因为它会向哈希添加一些未知数据 . 因此,他们不需要找到与 md5(foo) 相匹配的任何东西,而是需要找到一些东西,当添加到已知的盐中时会产生 md5(foo.salt) (这是非常难做的) . 但它仍然没有通过运行字典的问题 .

声明:关于《哈希函数与加密最大不同》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_2301945.html