散列函數:修订间差异

删除的内容 添加的内容
无编辑摘要
 
(未显示12个用户的17个中间版本)
第4行:
|1 = zh-cn:健壮; zh-tw:強韌;
}}
'''散列函数'''({{lang-en|Hash function}})又称-{zh-cn:'''散列算法'''、'''哈希函数'''; zh-tw:'''雜湊演算法'''}-,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该[[函数]]将数据打乱混合,重新创建一个叫做'''散列值'''(又叫'''哈希值''')({{lang|en|hash values}},{{lang|en|hash codes}},{{lang|en|hash sums}},或{{lang|en|hashes}})的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。<ref>{{Cite book|title=The Crypto Encyclopedia: Coins, Tokens and Digital Assets from A to Z|last=Schueffel|first=Patrick|publisher=Growth Publisher|year=2019|isbn=|location=Bern, 瑞士|pages=|url=https://www.heg-fr.ch/media/lbdfnyd1/schueffelgroenewegbaldegger2019_crypto-encyclopedia_eng.pdf|last2=Groeneweg|first2=Nikolaj|last3=Baldegger|first3=Rico|access-date=2020-02-18|archive-date=2019-08-28|archive-url=https://web.archive.org/web/20190828012710/https://www.heg-fr.ch/media/lbdfnyd1/schueffelgroenewegbaldegger2019_crypto-encyclopedia_eng.pdf|dead-url=yes}}</ref>好的散列函数在输入域中很少出现[[碰撞_(计算机科学)|散列冲突]]。如果在[[散列表]]和[[数据处理]]中,不抑制冲突来区别数据,会使得[[数据库记录]]更难找到。
 
如今,雜湊演算法也被用來加密存在資料庫中的[[密碼]](password)字串,由於雜湊演算法所計算出來的'''雜湊值(Hash Value)'''具有'''不可逆'''(無法逆向演算回原本的數值)的性質,因此可有效的保護密碼。
 
[[File:Hash_function.svg|thumb|330px|right|散列函数的工原理的例子]]
 
== 散列函数的性质 ==
所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有[[确定性]]的结果,具有这种性质的散列函数称为单向散列函数。但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输值很可能是相同的,但也可能不同,这种情况称为「[[雜湊碰撞]](collision)」,这通常是两个不同长度的输入值,刻意计算出相同的输出值。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。
 
典型的散列函数都有非常大的[[定义域]],比如[[SHA-2]]最高接受(2<sup>64</sup>-1)/8长度的[[字节]][[字符串]]。同時散列函數一定有着有限的[[值域]],比如固定长度的[[位元|比特]]串。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的[[單射]]。在密码学中,散列函數必須具有不可逆性。
第23行:
{{main|密碼雜湊函数}}
 
雜湊值可用於唯一地識別機密資訊。這需要雜湊函式是抗碰撞(collision-resistant)的,意味著很難找到產生相同雜湊值的資料。雜湊函式分類為密碼雜湊函式和可證明的安全雜湊函式。第二類中的函式最安全,但對於大多數實際目的而言也太慢。透過生成非常大的雜湊值來部分地實現抗碰撞。例如,SHA-2256是最廣泛使用的密碼雜湊函式之一,它生成256位元值的雜湊值。
 
=== 确保传递真实的信息 ===
第49行:
对于像从一个已知列表中匹配一个MP3文件这样的应用,一种可能的方案是使用传统的散列函数——例如[[MD5]],但是这种方案会对时间平移、CD读取错误、不同的音频压缩算法或者音量调整的实现机制等情况非常敏感。使用一些类似于MD5的方法有利于迅速找到那些严格相同(从音频文件的二进制数据来看)的音频文件,但是要找到全部相同(从音频文件的内容来看)的音频文件就需要使用其他更高级的算法了。
 
那些并不紧随IT工业潮流的人往往能反其道而行之,对于那些微小差异足够健壮的散列函数确实存在。现存的绝大多数散列算法都是不够健壮的,但是有少数散列算法能够达到辨别从嘈杂房间里的扬声器里播放出来的音乐的健壮性。有一个实际的例子是[[Shazam Entertainment|Shazam]][http://www.shazam.com/] {{Wayback|url=http://www.shazam.com/ |date=20080821140538 }} 服务。用户可以用手机打开其app,并将话筒靠近用于播放音乐的扬声器。该项服务会分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较。用户就能够收到被识别的音乐的曲名。
 
==目前常見的雜湊演算法==
第55行:
{| class="wikitable"
!演算法名稱
!輸出大小(bits)([[位元|bits]])
!內部大小
!區塊大小
第64行:
| '''[[HAVAL]]''' || 256/224/192/160/128 || 256 || 1024 || 64 || 32 || 是
|- align="center"
| '''[[MD2 (cryptography)|MD2]]''' || 128 || 384 || 128 || No || 8 || 大多數
|- align="center"
| '''[[MD4]]''' || 128 || 128 || 512 || 64 || 32 || 是
第80行:
| '''[[RIPEMD|RIPEMD-160/320]]''' || 160/320 || 160/320 || 512 || 64 || 32 || 否
|- align="center"
| '''[[SHA家族|SHA-0]]''' || 160 || 160 || 512 || 64 || 32 || 是
|- align="center"
| '''[[SHA家族|SHA-1]]''' || 160 || 160 || 512 || 64 || 32 || 有缺陷
|- align="center"
| '''[[SHA家族-2|SHA-256/224]]''' || 256/224 || 256 || 512 || 64 || 32 || 否
|- align="center"
| '''[[SHA家族-2|SHA-512/384]]''' || 512/384 || 512 || 1024 || 128 || 64 || 否
|- align="center"
| '''[[Tiger (cryptography)|Tiger(2)-192/160/128]]''' || 192/160/128 || 192 || 512 || 64 || 64 || 否
第100行:
* [[BLAKE]]
 
== 参考资料文献 ==
=== 引用 ===
{{Reflist}}
 
=== 来源 ===
{{ReflistH}}
* [https://web.archive.org/web/20050530071005/http://www.extra.research.philips.com/natlab/download/audiofp/cbmi01audiohashv1.0.pdf Robust Audio Hashing for Content Identification]
{{ReflistF}}
 
== 外部链接 ==
* [http://www.sigma.me/2011/09/13/hash-and-bloom-filter.html Hash和Bloom Filter介绍] {{Wayback|url=http://www.sigma.me/2011/09/13/hash-and-bloom-filter.html |date=20111020130547 }}
* [http://www.partow.net/programming/hashfunctions/index.html General purpose hash function algorithms C/C++/Pascal/Java/Ruby] {{Wayback|url=http://www.partow.net/programming/hashfunctions/index.html |date=20060618031431 }}
* [http://burtleburtle.net/bob/hash/evahash.html Hash Functions for Hash Table Lookup] {{Wayback|url=http://burtleburtle.net/bob/hash/evahash.html |date=20160112012118 }} by Bob Jenkins
* [http://www.azillionmonkeys.com/qed/hash.html 散列函数] {{Wayback|url=http://www.azillionmonkeys.com/qed/hash.html |date=20060615013036 }}by Paul Hsieh
* [https://web.archive.org/web/20061206022506/http://www.rsasecurity.com/rsalabs/node.asp?id=2176 什么是散列函数?] from RSA Laboratories
* [http://arquivo.pt/wayback/20100530092446/http%3A//home1.paulschou.net/tools/xlate/ Online Char(ASCII),HEX, Binary, Base64, etc... Encoder/Decoder with MD2, MD4, MD5, SHA1+2, etc. hashing algorithms]
* [http://3amsystems.com/monetics/crypto.php Crypto-Toolbox] {{Wayback|url=http://3amsystems.com/monetics/crypto.php |date=20080828022508 }} - Online cryptography, hashing and PIN block sanity checking for EftPos developers.
* [https://web.archive.org/web/20180620001154/https://passwordsgenerator.pro/sha256 Hash值在线计算]