磨空心3星評(píng)價(jià)
2020-04-22 14:45:35
hash是什么,有點(diǎn)類(lèi)似「洗牌」把牌洗亂的概念,只是洗的不是牌,而是一筆數(shù)據(jù),這個(gè)「洗」的過(guò)程是經(jīng)過(guò)嚴(yán)謹(jǐn)定義的,且產(chǎn)生的結(jié)果會(huì)是固定長(zhǎng)度的。常見(jiàn)的hash算法有MD5.RIPEMD-160.SHA1.SHA256等,不同hash算法「洗」的過(guò)程都不同,產(chǎn)生出來(lái)hash值長(zhǎng)度也不同,像是MD5不管喂進(jìn)去的數(shù)據(jù)多大,最終都會(huì)產(chǎn)生128 bits的結(jié)果,而SHA256產(chǎn)生的hash值則會(huì)是256 bits。一個(gè)好的hash算法通常需要具備以下這些特性:
1.輸入任意長(zhǎng)度的數(shù)據(jù),產(chǎn)生的hash值是固定長(zhǎng)度的
2.取得hash值的計(jì)算過(guò)程是快速的
3.輸入的數(shù)據(jù)有任何一點(diǎn)改變,產(chǎn)生的hash值會(huì)有很大的差異
4.具有單向性,可輕易輸入數(shù)據(jù)取得hash值,但無(wú)法從hash值得知原始數(shù)據(jù)的內(nèi)容
hash可以拿來(lái)做什么呢?假如今天阿牛在下班前打了一份500頁(yè)的重要文件,因?yàn)槲募苤匾荒軒щx公司,那隔天他上班時(shí)如何得知是否有人趁晚上潛入公司偷改他的文件,有一個(gè)很簡(jiǎn)單的作法,就是取得整份文件的hash值,比如說(shuō)用SHA256取得一個(gè)256bits的hash值,然后記在紙上或其他地方,隔天到公司時(shí),只要對(duì)這份文件取得hash值,然后跟昨天下班前得到那個(gè)256bits的hash值比對(duì),如果兩者有差異,表示有人偷改這份文件,阿牛就要再仔細(xì)檢查這份文件,如果兩者一樣,表示文件沒(méi)有被修改過(guò),阿??梢园残牡睦^續(xù)編輯他的文件。
再回來(lái)看為什么一個(gè)好的hash值需要上述的四點(diǎn)呢?
1.固定長(zhǎng)度:因?yàn)榻Y(jié)果是固定長(zhǎng)度的,阿牛可以知道要準(zhǔn)備多大張的紙來(lái)抄,而不會(huì)有時(shí)長(zhǎng)有時(shí)短,也不方便比對(duì)。若是程序來(lái)說(shuō),設(shè)計(jì)者可以事先規(guī)劃多大的空間放置hash值,不用擔(dān)心Overflow的問(wèn)題
2.快速得到結(jié)果:雖然輸入的數(shù)據(jù)越大,計(jì)算hash的時(shí)間會(huì)相對(duì)增加,不過(guò)整體的過(guò)程還是不需要太復(fù)雜的計(jì)算,因此即便阿牛的文件是500頁(yè),也可以快速的得到hash值
3.任何改變產(chǎn)生的結(jié)果都截然不同:阿牛的整份500頁(yè)文件即便有人多加了一個(gè)空格,隔天阿牛也可以明顯的知道hash值不一樣了,而第三個(gè)特性還有一個(gè)重要的原因,就是不能讓原始數(shù)據(jù)與hash值可以看出什么關(guān)聯(lián)性,因此即便是原始數(shù)據(jù)有任何一點(diǎn)改變,結(jié)果都是截然不同的
4.具有單向性:假如今天阿牛不小心將紙條掉落在電梯里,被其他人撿走也不會(huì)擔(dān)心重要文件的信息會(huì)外流,因?yàn)闊o(wú)法從hash值回推原始數(shù)據(jù)的內(nèi)容
hash應(yīng)用非常廣泛,比如說(shuō)網(wǎng)站登入時(shí)會(huì)先將密碼轉(zhuǎn)成hash值,若有人擷取到信息,密碼也不會(huì)外流。有些軟件也會(huì)提供hash值,使用者下載后可以將檔案hash比對(duì),就能知道下載的軟件是否有被竄改。而數(shù)位簽章也是使用hash來(lái)減少需要加密的數(shù)據(jù)。不過(guò)有些hash算法像是MD5.SHA1已經(jīng)不建議使用了。
那么hash值與比特幣有什么關(guān)系呢?比特幣所謂的「挖礦」,其實(shí)就是不斷的計(jì)算hash
直到找到合法的hash值,這個(gè)合法的hash值就是我們上一篇說(shuō)的「幸運(yùn)草」。我們?cè)诘谝黄恼吕镎f(shuō)到區(qū)塊鏈的特性之一「難以竄改」就是利用hash值一筆一筆串接下去產(chǎn)生「鏈」的概念,其中任何數(shù)據(jù)被竄改,會(huì)讓原本合法的hash值變成不合法,導(dǎo)致「鏈」斷掉下一篇我們就來(lái)講比特幣的「區(qū)塊」有哪些數(shù)據(jù),「挖礦」是怎么計(jì)算hash值的,并將「區(qū)塊」連成「區(qū)塊鏈」。
全興5星評(píng)價(jià)
2020-04-22 14:46:27
Hash算法我們可能早就聽(tīng)過(guò),不僅僅應(yīng)用在密碼學(xué)領(lǐng)域。由于hash算法所體現(xiàn)的思想十分的滿(mǎn)足我們的需求,比如可以把一個(gè)十分復(fù)雜的東西映射到另外一個(gè)較為簡(jiǎn)單的地方,所以很多地方都有應(yīng)用。
1. 什么是hash算法?
Hash(哈希或散列,Hash Algorithm)算法是信息技術(shù)領(lǐng)域非常基礎(chǔ)也非常重要的技術(shù)。它能任意長(zhǎng)度的二進(jìn)制值(明文)映射為較短的固定長(zhǎng)度的二進(jìn)制值(Hash值),并且不同的明文很難映射為相同的Hash值。
Hash算法的核心思想:基于內(nèi)容進(jìn)行編址或者命名。
2. Hash算法的特點(diǎn)
一個(gè)優(yōu)秀的 hash 算法,將能實(shí)現(xiàn):
正向快速:給定明文和hash算法,在有限時(shí)間和有限資源內(nèi)能計(jì)算出hash值。
逆向困難:給定(若干)hash值,在有限時(shí)間內(nèi)很難(基本不可能)逆推出明文。
輸入敏感:原始輸入信息修改一點(diǎn)信息,產(chǎn)生的hash值看起來(lái)應(yīng)該都有很大不同。
沖突避免:很難找到兩段內(nèi)容不同的明文,使得它們的hash值一致(發(fā)生沖突)。
如果給定一個(gè)明文前提下,難以找到碰撞的另一個(gè)明文,稱(chēng)為“弱抗碰撞性”;如果難以找到任意兩個(gè)明文,發(fā)生碰撞,則稱(chēng)算法具有“強(qiáng)抗碰撞性”。
3. 流行的hash算法
目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。
MD是Message Digest的縮寫(xiě)。
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年設(shè)計(jì)的,MD 是 Message Digest 的縮寫(xiě)。其輸出為 128 位。MD4 已證明不夠安全。
MD5(RFC 1321)是 Rivest 于1991年對(duì) MD4 的改進(jìn)版本。它對(duì)輸入仍以 512 位分組,其輸出是 128 位。MD5 比 MD4 復(fù)雜,并且計(jì)算速度要慢一點(diǎn),更安全一些。MD5 已被證明不具備"強(qiáng)抗碰撞性"(強(qiáng)抗碰撞性參考上面的內(nèi)容)。
SHA (Secure Hash Algorithm)是一個(gè) Hash 函數(shù)族,由 NIST(National Institute of Standards and Technology)于 1993 年發(fā)布第一個(gè)算法。目前知名的 SHA-1 在 1995 年面世,它的輸出為長(zhǎng)度 160 位的 hash 值,因此抗窮舉性更好。SHA-1 設(shè)計(jì)時(shí)基于和 MD4 相同原理,并且模仿了該算法。SHA-1 已被證明不具"強(qiáng)抗碰撞性"。
4. hash算法的缺點(diǎn)
一般而言,Hash需要較強(qiáng)的算力資源,所以算力很可能成為hash算法的瓶頸。一般選擇進(jìn)行hash算法的CPU需要較高的主頻。
5. Hash算法與數(shù)字摘要之間的關(guān)系
數(shù)字摘要的意思是對(duì)內(nèi)容進(jìn)行Hash運(yùn)算,把運(yùn)算結(jié)果作為唯一的值來(lái)代表之前的值。
根據(jù)前面所學(xué)習(xí)的內(nèi)容,我們可以根據(jù)前面所學(xué)的hash函數(shù)的特點(diǎn)之一(抗碰撞性)來(lái)解決確保內(nèi)容沒(méi)有被篡改的問(wèn)題。
數(shù)字摘要是Hash算法的一個(gè)很重要的使用場(chǎng)景。當(dāng)我們?cè)诰W(wǎng)絡(luò)上下載東西的時(shí)候,很可能被不法分子篡改,這個(gè)時(shí)候我們就可以對(duì)下載的資源進(jìn)行數(shù)字摘要,這樣當(dāng)我們下載之后,通過(guò)把下載的文件進(jìn)行Hash計(jì)算,把結(jié)果與數(shù)字摘要進(jìn)行對(duì)比,就可以知道文件是否被篡改。