Kuna kutokuelewana kwa kawaida kwamba hashing na encryption ni kitu kimoja. Hawakuwa. Hash haiwezi kurekebishwa. Chukua mfano ufuatao kama mfano:
$ echo-n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb-
Tunapitisha kamba "Password123" kwa algorithm ya MD5 (algo), ambayo hufanya shughuli za hisabati na kurudisha hash iliyosimbwa ya hexadecimal iliyozalishwa. Njia pekee ya kupata thamani sawa ya pato la hash ni kuingiza algo ghafi. Kuna mgogoro, lakini tunaweza kuujadili baadaye.
Pato la algoriti nyingi za hashi ni mfuatano wa binary wa urefu usiobadilika uliosimbwa kwa hexadecimal. Wengine, kama mfano huu, hutumia kamba za encoded za base64 kama pato. Tafadhali kumbuka kuwa urefu daima ni sawa:
{SHA} uNF8eZRJ8jmr8WTjyocRJPVpe7w =
{SHA} lqdu/Zr6o2dgIER8Up1/7lcUtgw =
{SHA} qYUOwLMlDEuukA5HCT4LR1kQzco =
{SHA} MXZBCPYWJ7TTTS1W2KGGJSLWNWTG =
{SHA} 2sAPLaUh9Mz0bI + XxKEg7qyABe8=
TL; Dr
Sitaki kuzungumza sana juu ya encryption (kwa sababu mambo hayo ni ya vitabu), lakini ni muhimu kuweza kutofautisha mifuatano ya hash na mifuatano ya encryption. Encryption kawaida hujaza kamba ili kukidhi urefu maalum kabla ya encryption kutokea. Pia inahitaji ufunguo (au nenosiri) ili kusimbua. Ikiwa unatumia nenosiri la encrypted, kamba itabadilika kulingana na urefu wa pembejeo. Ikiwa unaona rundo la nywila za ciphertext, urefu hutofautiana, na unaweza kuwa unashughulika na encryption badala ya hash. Mfano wa AES-256-CBC Kamba zilizosimbwa na maandishi wazi yanayohusiana (ufunguo ni "ASDF"):
foobar | U2FsdGVkX19G + KtytNHdj6yH2AVvX26pEmtunS/PRnU = foobarfoobar | U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog = foobarfoobarfoobar | U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX + ldatuqv2xexeaeoww0xg/EXJUe9aSUz $ paka encrypted_passwords U2FsdGVkX19G + KtytNHdj6yH2AVvX26pEmtunS/PRnU = U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog = U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX + lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz $ kwa i katika `cat encrypted_passwords`; do echo $i | openssl enc -base64 -d -aes-256-cbc -pass pass:asdf; mwangwi; Imekamilika foobar foobarfoobar foobarfoobarfoobar
Sasa unaweza kufikiri: Unaweza kuwa sahihi. Hata hivyo, nyenzo muhimu lazima zipatikane kwa mfumo inamaanisha kuwa kimsingi nenosiri kuu la maandishi tupu liko mahali fulani-iwe kama ufunguo wa RSA au nenosiri au faili, iliyopachikwa kwenye hifadhidata, iliyosimbwa kwa bidii katika programu, au mahali fulani kwenye kumbukumbu. pfft, hakuna mtu ' anayeenda kutumia asdf kama ufunguo wa kusimba nywila za watumiaji wao '
Tumia mfuatano sawa wa MD5:
foobar | 3858f62230ac3c915f300c664312c63f foobarfoobar | 59faa421729e846dd800dce59943bfc0 foobarfoobarfoobar | 1352aadab322d1a033c27964be0965db
Nenosiri la hash ni mbali na ukamilifu, kwa kweli ni mbaya kidogo, lakini ni mbaya zaidi kuliko encryption kwa sababu ya kile inachojaribu kufikia. Watumiaji huchagua mahitaji ya chini kabisa mara nyingi kuliko sio, na wanaweza kuitumia kwenye tovuti nyingi. "hacks" nyingi kwa kweli sio chochote zaidi ya mashambulizi ya utumiaji wa kitambulisho. Ikiwa maelewano ya awali ni kutumia encryption, basi jitihada pekee ambayo mshambuliaji anapaswa kufanya ni kupata ufunguo ambao unafafanua nywila zote. Kwa hash, wanahitaji angalau kufanya jitihada za kuzipasua. Inapotumiwa na algoriti za kisasa kama vile sha512crypt, bcrypt, scrypt, au argon2, thamani ya hash inaweza kuhitaji juhudi kubwa kupasuka.
Kuongeza chumvi ni kuongeza kamba kwenye nenosiri kabla ya hash. Chumvi kwa kila hash inapaswa kuwa ya kipekee, kwa kawaida kuchaguliwa kwa nasibu, kwa sababu lengo ni kufanya maandishi sawa ya wazi "nenosiri" hash thamani tofauti kila wakati. Hii inafanya maisha ya mvunjaji wa nenosiri kuwa magumu, kwani ili kuangalia neno "nenosiri" kwa kila mtumiaji kati ya watumiaji 1,000, kila mtumiaji ana chumvi ya kipekee, inabidi wafanye kazi mara 1,000-mara moja kwa kila mtumiaji/chumvi. Hii pia inamaanisha kuwa hawawezi kutumia kamusi zilizokusanywa kabla au meza za upinde wa mvua kwa ufanisi (kwa kawaida...) kwa sababu wanahitaji desturi kwa kila chumvi.
Tovuti wakati mwingine huharibu hii na kutumia chumvi ya jumla kwa watumiaji wote; Hii ni kinyume na kusudi.
Ifuatayo ni hashi ya SHA1 yenye chumvi:
b353977827f67a4ae0318f3a9447fae1c13d9d90:b8d18ca |___________________________________________| hash | chumvi | separator
Nakala wazi ya hash hii ni "Nenosiri". Thamani yake ya chumvi ni "b8d18ca" na hutumia API ya SHA1 ($salt.$pass). Hii ina maana kwamba algorithm inachukua maandishi ya wazi ya Nenosiri, hutoa Chumvi, na kuiongeza mbele ya maandishi ya wazi. Wakati tovuti au programu inajaribu kuthibitisha nenosiri lako katika siku zijazo, inachukua nenosiri lako la wazi kama ingizo, inasoma thamani ya chumvi katika Hash iliyohifadhiwa, inaiongeza mbele ya nenosiri ulichochagua, na inalinganisha thamani ya Hash iliyozalishwa na thamani ya Hash iliyohifadhiwa. Upasuaji Ikiwa haujui kuwa sehemu yake ni chumvi, hashi itatoa maandishi wazi yafuatayo:
b8d18capassword
Kwa kuwa algoriti hufanya maandishi wazi. ingizo, chumvi na thamani ya hashi inayozalishwa inaweza kubaki wazi kwa mtumiaji. Wakati wa kupasuka, ikiwa algorithm ni chumvi, tunahitaji kujua chumvi ili tuweze kuitoa wakati wa kuzalisha plaintext ya mgombea.
Ikiwa inatekelezwa vizuri, chumvi inaweza kufanya kupasuka kwa muda zaidi. Kwa chumvi ya random, unalazimisha Cracker kupoteza muda kujaribu kuvunja hash ambayo chumvi hailingani. Hii inakamilisha juhudi zinazohitajika kwa kifaa cha kifaa/namba_of_salts kwa sababu tunahitaji kuzalisha mgombea kwa kila aina ya chumvi. Ikiwa chumvi ni tuli, basi shughuli za hisabati ni sawa... speed_of_device/1. Njia nyingine ya kuangalia hii:
yetu GTX 980 nyufa SHA1 ($salt.$pass) katika 3576.8 MH/s au 3.5 bilioni wagombea kwa sekunde hashlist yetu ina 1000 chumvi za kipekee 3,500,000,000 / 1000 = 3,500,000 wagombea kwa pili
Hii ni polepole kwa maagizo matatu ya ukubwa na hasara ya 99.9%. Unapotumia chumvi tuli, inaonekana kama hii:
GTX yetu 980 nyufa SHA1 ($salt.$pass) katika 3576.8 MH/s au 3.5 bilioni wagombea kwa sekunde hashlist yetu ina 1 chumvi ya kipekee 3,500,000,000 / 1 = 3,500,000,000 Wagombea kwa pili
Ikiwa hii haina maana, endelea kusoma, tutakuwa na chati nzuri baadaye...
Uboreshaji mwingine wa kawaida ikilinganishwa na "hash hii plaintext" tu ni, "hash hii plaintext, kisha hash matokeo hayo, kisha hash matokeo hayo" kurudiwa maelfu ya mara. Hii inaruhusu nenosiri moja la mgombea kujaribu wakati programu ya kuvunja nenosiri inapaswa kufanya maelfu ya kazi. Hii inaitwa marudio, kitanzi, au gharama inayobadilika. Baadhi ya algoriti za hashi za nenosiri hutumia raundi za kurudia zilizosimbwa kwa bidii; Nyingine Git. Kisha kuifanya iweze kusanidiwa katika sehemu ya Hash yenyewe. Kwa mfano, md5crypt () hutumia MD5, ikiwa ni pamoja na chumvi, na huzunguka mara 1000. sha512crypt () hutumia sha512, inajumuisha chumvi, na inazunguka kwa idadi inayoweza kusanidiwa (chaguo-msingi ni 5,000).
Marudio huathiri hasa gharama ya mzunguko wa hesabu ya algoriti ya hashi, badala ya matumizi yake ya kumbukumbu au mambo mengine. Hizi pia ni mashambulizi muhimu wakati wa kubuni ambayo yameboreshwa ili kupinga aina fulani za aina za hash, lakini hii ni magugu sana kujadiliwa hapa.
Hebu tuangalie baadhi ya mifano ya kuonyesha athari za uteuzi wa algorithm ya hashi, iwe ni chumvi, kutumia iterations nyingi, nk. Tuseme mshambuliaji alikusanya hash ya watumiaji 1,000 kutoka kwa tovuti fulani iliyoambukizwa, na wanataka tu kufanya shambulio rahisi la kupima hash ya nenosiri kwa kila-nenosiri la wagombea milioni 143.
Aina ya hashi inayotumiwa na tovuti iliyoambukizwa itakuwa na athari kubwa kwa muda unaohitajika kwa mshambuliaji kupitia shambulio hilo. Hii ni chati (jamaa, takriban) ni sekunde ngapi inachukua kukamilisha shambulio hili, kulingana na aina ya hashi iliyotumiwa, ambapo kadi ya kawaida ya graphics:
Naam, hiyo haina maana! Aina ya hashi yenye nguvu zaidi ni polepole zaidi, lakini aina ya haraka ni tu iliyopigwa hadi hakuna chochote. Hebu tujaribu tena ukubwa sawa wa data kwa kutumia muda wa logarithmic x-axis. Baa zinapohamia kutoka kushoto kwenda kulia, zitaongezeka kwa nguvu ya 10:
Kwa hivyo baadhi ya mambo muhimu ni: Wakati unataka kuvunja hash ya nenosiri, raundi moja ni rahisi kuliko raundi nyingi na bila chumvi kuliko kuongeza chumvi. Kinyume chake, wakati kampuni fulani au tovuti zinatangaza uvunjaji wa data ulio na data ya mtumiaji, a) nywila ni bora kuwa na hash, sio maandishi tupu tu; b) Wao ni bora kuwa na chumvi, sio hash tu; c) Wao ni bora kuwa na nguvu nyingi raundi chumvi hash kutumia wakati wote, si tu raundi moja.
Kabla ya kujaribu kuvunja hash iliyotolewa ya nenosiri, ni juu ya mvunjaji kujua ni algorithm gani ya hash inatumika kutekeleza. Kutambua aina ya hash mara nyingi ni rahisi, lakini sio kila wakati. Crackers mara nyingi hufanya makisio yenye msingi kulingana na vidokezo kama vile urefu wa hashi na umbizo. Katika uchambuzi wa mwisho, njia pekee ya kuwa na uhakika kwamba nadhani ya aina ya hash ni sahihi ni ikiwa hash imevunjwa.
Baadhi ya rasilimali bora kwa kazi hii zinapatikana hapa na hapa, zote zinaonyesha jinsi maadili ya kawaida ya hash yanavyoonekana.
Kifurushi cha "hash-identifier" (kinachopatikana hapa) kinapatikana katika Kali Linux ili kusaidia kutambua aina zisizojulikana za hash.
Mgongano hutokea wakati pembejeo mbili tofauti husababisha matokeo sawa ya hash. Hii ni mbaya (dhahiri). Kwa nenosiri, hii inaweza kumaanisha kuwa huenda sikuivunja nenosiri lako halisi, lakini kwa kuwa nimepata ingizo ambalo linatoa thamani sawa ya hash, ninaweza kutumia thamani ya maandishi tupu kudanganya mfumo kudhani kuwa nenosiri ni halali.
Microsoft Office hutumia algorithm katika ulinzi wake wa hati ambayo imekuwa ikikabiliwa na migogoro kwa miaka mingi. Sio kawaida kugundua migogoro mingi ya hash moja, yote ambayo hufungua hati.
Mara tu mgongano unapopatikana, algorithm inaharibiwa. Ikitokea mara moja, kitakwimu kuna uwezekano mkubwa wa kutokea tena. Kitu pekee ambacho kinatuzuia ni wakati na uwezo wa usindikaji. Kadiri algoriti zinavyozidi kuwa thabiti, inachukua uwezo na muda zaidi kuzalisha algoriti za mtahiniwa na kulinganisha matokeo ya hashi ili kuzitafuta. Matokeo yake, wabunifu wanazidi kuwa wazuri katika kuunda algorithms ambazo haziwezi kukabiliwa na migogoro.