Esminis skirtumas tarp Hashing ir Encryption algoritmų

Matau daug painiavos tarp maišų ir šifravimo algoritmų, ir norėčiau išgirsti daugiau ekspertų patarimų:

  • Kada naudoti šifravimą prieš šifravimą

  • Kas išskiria maišymo arba šifravimo algoritmą (nuo teorinio / matematinio lygio), t. daro maišos negrįžtamą (be vaivorykštės medžio pagalbos)

Štai keletas panašių SO klausimų, kurie nebuvo įtraukti į išsamią informaciją, kurią ieškojau:

Koks skirtumas tarp obfuscation, hashing ir šifravimo?
Skirtumas tarp šifravimo ir maišymo

427
09 февр. Kenny Cason nustatė 09 vasario mėn 2011-02-09 20:30 '11, 20:30, 2011-02-09 20:30
@ 11 atsakymų

Na, jūs galėtumėte jį rasti Wikipedijoje ... Bet kadangi norite paaiškinimo, aš čia darysiu viską.

Hash funkcijos

Jie suteikia galimybę susikurti savavališką ilgio įvestį ir (paprastai) fiksuotą (arba trumpesnį) išėjimą. Tai gali būti bet kas nuo paprasto crc32 iki pilno kriptografinio maišymo funkcijos, pvz., MD5 arba SHA1 / 2/256/512. Esmė ta, kad vyksta vienpusis žemėlapis. Tai visada yra daug: 1 kartografavimas (tai reiškia, kad visada bus susidūrimų), nes kiekviena funkcija sukuria mažesnį rezultatą nei gali įvesti (jei pateikiate kiekvieną galimą 1 MB failą į MD5, gausite tonų susidūrimų).

Priežastys, dėl kurių jos yra sudėtingos (arba neįmanoma praktiškai įgyvendinti), priešingai, yra susijusios su tuo, kaip jie dirba šalyje. Dauguma kriptografinių maišos funkcijų pakartoja kelis įvesties duomenis kelis kartus, kad gautų rezultatą. Todėl, jei pažvelgsime į kiekvieną fiksuoto ilgio segmentą (kuris priklauso nuo algoritmo), maišos funkcija sukels šią dabartinę būseną. Tada jis eina per valstybę ir pakeičia ją į naują ir naudoja ją kaip grįžtamąją informaciją (MD5 tai daro 64 kartus kiekvienam 512 bitų duomenų fragmentui). Tada kažkaip susilieja gautos būsenos iš visų šių iteracijų kartu suformuojant gautą maišą.

Dabar, jei norite iššifruoti maišelį, pirmiausia turite išsiaiškinti, kaip sulaužyti tam tikrą maišą į iteruotas būsenas (1 galimybė įvesti mažiau duomenų bloko dydžio, daugelis didelių įėjimų). Tada jums reikės atšaukti kiekvienos valstybės iteraciją. Dabar, norėdami paaiškinti, kodėl tai labai sunku, įsivaizduokite, kad bandysite išvesti a ir b iš šios formulės: 10 = a + b . Yra 10 teigiamų a ir b derinių, kurie gali veikti. Dabar kreipiamės į šią grandinę: tmp = a + b; a = b; b = tmp tmp = a + b; a = b; b = tmp tmp = a + b; a = b; b = tmp . 64 iteracijų atveju turėsite daugiau nei 10 ^ 64 galimybių išbandyti. Ir tai tik paprastas papildymas, kai tam tikra būsena yra išsaugota nuo iteracijos iki iteracijos. Tikrosios maišos funkcijos atlieka daug daugiau nei 1 operaciją (MD5 veikia apie 15 operacijų 4 būsenos kintamuosiuose). Ir kadangi kitas kartojimas priklauso nuo ankstesnės ir ankstesnės būklės, jis sunaikinamas, kai sukuriama dabartinė būsena, vis dar neįmanoma nustatyti įvesties būsenos, kuri lėmė nurodytą išėjimo būseną (kiekvienam iteracijai ne mažiau). Sujunkite, kad su dideliu skaičiumi funkcijų ir dekodavimo netgi MD5 užims beveik begalinį (bet ne begalinį) išteklių kiekį. Tiek daug išteklių, kad iš tikrųjų yra daug pigiau apytikriai priversti maišelį, jei turite idėją apie įvesties dydį (mažiems įėjimams), nei bandant iššifruoti maišos.

Šifravimo funkcijos

Jie suteikia 1: 1 žemėlapio tarp savavališkų įvesties ir išvesties ilgių. Ir jie visada yra grįžtami. Svarbu pažymėti, kad jis yra grįžtamasis naudojant tam tikrą metodą. Ir visada 1: 1 tam tikram raktui. Dabar yra keletas įvesties porų: poros, kurios gali generuoti tą patį išėjimą (iš tiesų, tai paprastai priklauso nuo šifravimo funkcijos). Geri šifruoti duomenys neatitinka atsitiktinio triukšmo. Tai skiriasi nuo geros maišos išėjimo, kuris visada turi nuoseklią formatą.

Naudoti atvejus

Jei norite palyginti vertę, naudokite maišos funkciją, bet negalite išsaugoti paprasto atvaizdavimo (dėl kokios nors priežasties). Slaptažodžiai turėtų labai gerai atitikti šį naudojimo atvejį, nes nenorite saugoti jų teksto formatu saugumo sumetimais (ir neturėtų). Bet kas, jei norite patikrinti piratinių muzikos failų failų sistemą? 3 MB vienam muzikos failui būtų netinkama. Taigi vietoj to paimkite failo maišelį ir išsaugokite jį (md5 išsaugos 16 baitų vietoj 3 MB). Taigi, jūs paprasčiausiai apdorojate kiekvieną failą ir palyginate ją su saugoma duomenų baze (tai taip pat neveikia praktiškai dėl kodavimo, failų antraštių keitimo ir tt, tačiau tai yra naudojimo pavyzdys).

Patikrinkite įvesties duomenų patikimumą naudodami maišos funkciją. Štai ką jie skirti. Jei turite 2 įvesties dalis ir norite patikrinti, ar jie atitinka, paleiskite juos per maišos funkciją. Susidūrimo tikimybė yra astronomiškai maža mažiems įvesties dydžiams (darant prielaidą, kad yra gera maišos funkcija). Štai kodėl jis rekomendavo naudoti slaptažodžius. Jei slaptažodžiai yra iki 32 simbolių, md5 turi 4 kartus didesnę išėjimo erdvę. SHA1 turi 6 kartus didesnę išėjimo erdvę (apytiksliai). SHA512 turi maždaug 16 kartų didesnę išėjimo erdvę. Nesvarbu, koks slaptažodis yra, nesvarbu, ar tai yra tas pats, kuris buvo išsaugotas. Štai kodėl turėtumėte naudoti slaptažodį.

Naudokite šifravimą, kai reikia grąžinti įvesties duomenis. Atkreipkite dėmesį į žodį . Jei saugote kredito kortelių numerius, turite juos grąžinti tam tikru momentu, tačiau nenorite jų išsaugoti paprastu tekstu. Todėl išsaugokite šifruotą versiją ir išsaugokite raktą kuo saugiau.

Hash funkcijos taip pat puikiai tinka pasirašant duomenis. Pvz., Jei naudojate HMAC, jūs pasirašote duomenis, paimdami duomenų sujungimą su žinoma, bet neperduota verte (slapta vertė). Taigi siunčiate paprastą tekstą ir HMAC maišą. Tada imtuvas paprasčiausiai sugrąžina pateiktus duomenis žinoma verte ir patikrina, ar jis atitinka perduodamą HMAC. Jei taip yra, jūs žinote, kad partija be slaptos vertės nebuvo suklastota. Tai dažniausiai naudojama saugiose slapukų sistemose, naudojančiose HTTP infrastruktūrą, taip pat HTTP pranešimuose, kur jums reikia pasitikėjimo duomenų vientisumu.

Slaptažodžio maišymo pastaba:

Pagrindinė kriptografinių maišos funkcijų ypatybė yra ta, kad jie turi būti labai greitai sukurti ir labai sunku / lėtai apversti (tiek, kad tai beveik neįmanoma). Tai sukuria slaptažodžio problemą. Jei saugote „ sha512(password) , nieko nedarote, kad apsaugotumėte nuo vaivorykštės lentelių ar brutalinių jėgų atakų. Atminkite, kad maišos funkcija buvo sukurta greičiui. Tokiu būdu yra neįtikėtina, kad įsibrovėlis tiesiog paleistų žodyną per maišos funkciją ir patikrintų kiekvieną rezultatą.

Įdėjus druską, klausimai padeda, nes ji priduria keletą nežinomų duomenų. Todėl vietoj to, kad rastų kažką, kas atitinka md5(foo) , jie turi rasti kažką, kas, pridėjus prie žinomos druskos, gamina md5(foo.salt) (kuris yra daug sunkiau padaryti). Tačiau ji vis dar neišsprendžia greičio problemos, nes jei žino druską, tai tik žodyno pradžia.

Taigi, yra būdų, kaip tai padaryti. Vienas populiarus metodas vadinamas rakto sustiprinimu (arba raktų tempimu). Iš esmės kartojate maišą daug kartų (paprastai tūkstančiai). Tai du dalykai. Pirma, jis žymiai sulėtina maišymo algoritmo vykdymo laiką. Antra, jei realizuota teisė (įvesties ir druskos perkėlimas atgal į kiekvieną iteraciją) iš tikrųjų padidina išvykimo entropiją (laisvą erdvę), sumažindama susidūrimo tikimybę. Trivialus įgyvendinimas:

 var hash = password + salt; for (var i = 0; i < 5000; i++) { hash = sha512(hash + password + salt); } 

Yra ir daugiau standartinių diegimų , tokių kaip PBKDF2 , BCrypt . Tačiau šį metodą naudoja nemažai su saugumu susijusių sistemų (pvz., PGP, WPA, Apache ir OpenSSL).

Nepakanka apatinės linijos hash(password) . hash(password + salt) geriau, bet vis tiek nepakanka. Naudokite išplėstinį maišymo mechanizmą, kad sukurtumėte slaptažodį

Dar viena pastaba apie trivišką įtampą

Jokiu būdu nepateikite vieno maišos išėjimo iš karto į maišos funkciją :

 hash = sha512(password + salt); for (i = 0; i < 1000; i++) { hash = sha512(hash); // <-- Do NOT do this! } 

Taip yra dėl susidūrimų. Atminkite, kad visose maišymo funkcijose yra susidūrimų, nes galimas išėjimo plotas (galimų išėjimų skaičius) yra mažesnis nei įvesties vieta. Norėdami suprasti, kodėl, pažiūrėkime, kas atsitiks. Tarkime, kad mes manome, kad susidūrimo su sha1() ( daug mažiau ) tikimybė yra 0,001% mažesnė, bet demonstravimo tikslais.

 hash1 = sha1(password + salt); 

Dabar hash1 susidūrimo tikimybė yra 0,001%. Bet kai mes darome tokį hash2 = sha1(hash1); visi „ hash1 susidūrimai automatiškai tampa „ hash2 susidūrimais . Taigi dabar hash2 susidūrimo tikimybė yra 0,002%. Tai du kartus didesnė tikimybė! Kiekviena iteracija prideda dar vieną galimybę susidurti su 0.001% . Taigi, iš 1000 iteracijų, susidūrimo tikimybė šoktelėjo nuo trivialus 0,001% iki 1%. Dabar degradacija yra linijinė, o tikrosios tikimybės yra daug mažesnės, tačiau poveikis yra toks pats (tikimybė, kad viena susidūrimo su md5 tikimybė yra apie 1 / ( 2,128 ) arba 1 / (3x10 38 ). taip mažai, kaip atrodo).

Vietoj to, vėl įrašykite druską ir slaptažodį kiekvieną kartą, kai įvedate duomenis į maišos funkciją. Taigi, bet kokio konkretaus turo susidūrimai nebėra kito etapo susidūrimai. Taigi:

 hash = sha512(password + salt); for (i = 0; i < 1000; i++) { hash = sha512(hash + password + salt); } 

Ji turi tokią pačią susidūrimo tikimybę kaip „ sha512 gimtoji funkcija. Štai ką norite. Vietoj to naudokite.

638
09 февр. atsakymas pateiktas ircmaxell 09 vasaris 2011-02-09 20:36 '11 prie 20:36 2011-02-09 20:36

Maišos funkcija gali būti laikoma ta pačia kaip kepimo duona. Jūs pradėsite su įvestimis (miltais, vandeniu, mielėmis ir pan.), O pritaikius maišymo funkciją (maišymas + kepimas), gausite produkciją: duonos kepalą.

Kito kelio eiga yra labai sunku - jūs negalite atskirti duonos atgal į miltus, vandenį, mieles - kai kurie iš jų buvo prarasti kepimo proceso metu, ir jūs niekada negalite tiksliai pasakyti, kiek vandens ar miltų ar mielių buvo panaudota tam tikrai duonai. , nes ši informacija buvo sunaikinta maišymo funkcija (vadinamoji orkaitė).

Daugelis skirtingų įėjimų teoriškai gaus identiškas duonos (pvz., 2 puodeliai vandens ir 1 trilijono mielių duoda tiek pat duonos kaip 2,1 puodelio vandens ir 0,9 trilijono mielių), bet duodamas vieną iš šių kepalų. Aš tiksliai pasakysiu, kokių medžiagų derinys jie prisideda.

Šifravimas, kita vertus, gali būti laikomas saugiu. Viskas, ką jūs įdėjote ten, grįžta, jei turite raktą, kuriuo jis buvo užrakintas. Tai yra simetriška operacija. Atsižvelgiant į raktą ir tam tikrą įvestį, gaunate tam tikrą rezultatą. Atsižvelgiant į tą patį klavišą, grąžinsite pradinį įvestį. Tai yra 1: 1 kartografavimas.

145
09 февр. Atsakymas pateikiamas Marc B 09 vasario mėn. 2011-02-09 20:40 '11 prie 20:40 2011-02-09 20:40

Naudokite „hashes“, kai nenorite grįžti į pradinį įvestį, naudodami šifravimą.

Hashes ima tam tikrą įvestį ir paverčia jį kai kuriais bitais (paprastai laikomas numeriu, pavyzdžiui, 32 bitų sveikaisiais skaičiais, 64 bitų sveikaisiais skaičiais ir tt). Ta pati įvestis visada sukurs tą patį maišą, bet PRIPAŽINTI, kad prarandate informaciją šiame procese, kad negalėtumėte patikimai atkurti pradinio įvesties (yra keletas įspėjimų).

Šifravimas iš esmės išsaugo visą informaciją, kurią įdėjote į šifravimo funkciją, o tai paprasčiausiai apsunkina (idealiai neįmanoma), kad kas nors galėtų grįžti į pradinį įvestį be tam tikro rakto.

Paprastas maišos pavyzdys

Štai trivialus pavyzdys, padedantis suprasti, kodėl maišymas negali (paprastai) grąžinti pradinį įvestį. Tarkime, aš sukuriu 1 bitų maišelį. Mano „hash“ funkcija priima bitų eilutę kaip įvestį ir nustato hash į 1, jei įvesties eilutėje yra lygus bitų skaičius, kitaip 0, jei jis buvo nelyginis.

Pavyzdys:

 Input Hash 0010 0 0011 1 0110 1 1000 0 

Atkreipkite dėmesį, kad yra daug įvesties reikšmių, dėl kurių atsiranda 0, o daugelis jų sukelia maišymą 1. Jei žinote, kad maišos yra 0, tiksliai nežinote, kas yra pradinė įvestis.

Beje, šis 1-bitų maišos nėra visiškai išgalvotas ... pažiūrėkite į pariteto bitą .

Paprastas šifravimo pavyzdys

Tekstą galite užšifruoti naudodami paprastą raidės pakeitimą, tarkim, jei įvestis yra A, rašote B. Jei įvestis B, rašote C. Visiškai iki abėcėlės pabaigos, kur, jei įvestis yra Z, rašote A.

 Input Encrypted CAT DBU ZOO APP 

Kaip ir paprastas maišos pavyzdys, šis šifravimo tipas buvo naudojamas istoriškai .

39
09 февр. Atsakymą pateikė Eric J. 09 vasaris 2011-02-09 20:33 '11 at 20:33 2011-02-09 20:33

Leiskite pridėti pagrindinę maišos ir šifravimo / iššifravimo metodų apžvalgą.

Hash:

Jei dar kartą uždarote bet kokį paprastą tekstą , negalite gauti to paties paprasto teksto iš teksto . Tiesiog tai yra vienpusis procesas.

2019

25
07 апр. atsakymą pateikė mrsrinivas 07 balandžio. 2012-04-07 11:48 '12, 11:48, 2012-04-07 11:48

Mano vienas įdėklas ... Paprastai interviu norėjo atsakymo toliau.

Hashing yra vienas iš būdų. Negalite konvertuoti duomenų / eilutės iš maišos kodo.

Šifravimas - 2 būdai - galite užšifruoti šifruotą eilutę, jei turite raktą.

23
29 янв. Shiv Mohan atsakymas, pateiktas sausio 29 d 2013-01-29 08:10 '13, 8:10, 2013-01-29 08:10

Hash funkcija keičia kintamo dydžio tekstą į fiksuoto dydžio tekstą.

2019

12
10 апр. Julijos atsakymas balandžio 10 d 2014-04-10 12:14 '14 at 12:14 2014-04-10 12:14

Simetrinis šifravimas:

Simetrinis šifravimas taip pat gali būti vadinamas bendriniu raktu arba pasidalijamu slaptu šifravimu. Simetriniu šifravimu vienas raktas naudojamas tiek šifruoti, tiek iššifruoti srautą.

Asimetrinis šifravimas:

Asimetrinis šifravimas taip pat žinomas kaip viešojo rakto kriptografija. Asimetrinis šifravimas skiriasi nuo simetrinio šifravimo daugiausia tuo atveju, kai naudojami du raktai: vienas - šifravimui ir vienas - iššifravimui. Dažniausias asimetrinis šifravimo algoritmas yra RSA .