it-swarm-eu.dev

Jak zjistit, jaký typ kódování / šifrování byl použit?

Existuje způsob, jak zjistit, jaký typ šifrování/kódování se používá? Například testuji webovou aplikaci, která ukládá heslo do databáze v šifrovaném formátu (WeJcFMQ/8+8QJ/w0hHh+0g==). Jak zjistím, jaké hashování nebo šifrování se používá?

156
Karthik

Váš příkladný řetězec (WeJcFMQ/8+8QJ/w0hHh+0g==) je kódování Base64 pro sekvenci 16 bajtů, které nevypadají jako smysluplné ASCII nebo UTF-8. If je to hodnota uložená pro heslo - ověření (tj. ve skutečnosti „šifrované“ heslo, spíše „hashed“ heslo), je to pravděpodobně výsledek hašovací funkce vypočítané přes heslo; jedna klasická hashovací funkce se 128bitovým výstupem je MD5. Může to ale být o všem.

„Normálním“ způsobem, jak to zjistit, je podívat se na kód aplikace. Aplikační kód je ztělesňován hmatatelným, tlustým způsobem (spustitelné soubory na serveru, zdrojový kód někde ...), který není a nemůže být tak chráněn, jak to dokáže tajný klíč. Takže reverzní inženýrství je „způsob, jak jít“.

Kromě reverzního inženýrství můžete provést několik pokusů, abyste se pokusili udělat vzdělané odhady:

  • Pokud stejný uživatel „změní“ své heslo, ale znovu ho použije, změní se uložená hodnota? Pokud ano, pak část hodnoty je pravděpodobně náhodná „sůl“ nebo IV (za předpokladu symetrického šifrování).
  • Za předpokladu, že hodnota je určující z hesla pro daného uživatele, pokud si dva uživatelé zvolí stejné heslo, povede to ke stejné uložené hodnotě? Pokud ne, pak je pravděpodobně uživatelské jméno součástí výpočtu. Možná budete chtít zkusit spočítat MD5 („uživatelské jméno: heslo“) nebo jiné podobné varianty, abyste zjistili, zda se vám shoduje.
  • Je délka hesla omezená? Konkrétně, pokud nastavíte 40místné heslo a nemůžete se úspěšně autentizovat zadáním pouze prvních 39 znaků, znamená to, že všechny znaky jsou důležité, což znamená, že se jedná o heslo hashování, ne - šifrování (uložená hodnota se používá k ověření hesla, ale heslo nelze obnovit pouze z uložené hodnoty).
140
Thomas Pornin

Edit: Jen jsem si všiml velmi cool skriptu s názvem hashID . Jméno to do značné míry popisuje.

~~~

Obecně lze říci, že využití zkušeností k tomu, aby vzdělané odhady byly, jak se tyto věci dělají.

Zde je seznam s velmi velkým počtem hashových výstupů, abyste věděli, jak každý vypadá a vytvořil podpisy/plácat, nebo jen opticky ověřil.

Nejprve věnujte pozornost dvěma hlavním věcem:

  • délka hash (každá hashovací funkce má specifickou výstupní délku)
  • použitá abeceda (jsou všechna anglická písmena? číslice 0-9 a A-F tak hex, jaké speciální znaky existují, pokud existují?)

Několik programů pro praskání hesla (například John Ripper) aplikuje na vstup určité shody vzorů, aby odhadly použitý algoritmus, ale funguje to pouze na obecných hashe. Pokud například vezmete jakýkoli hašovací výstup a otočíte každé písmeno o 1, většina schémat přiřazování vzorů selže.

68
john

To, co jste zaúčtovali, je 16 bajtů (128 bitů) dat kódovaných základnou 64. Skutečnost, že je zakódována v základní 64, nám moc neříká, protože základní 64 není šifrovací/hashovací algoritmus, je to způsob, jak zakódovat binární data do textu. To znamená, že tento blok obsahuje jednu užitečnou informaci, a to, že výstup je dlouhý 16 bajtů. Můžeme to porovnat s velikostí bloků běžně používaných schémat a zjistit, co to nemůže být. Zdaleka nejběžnější schémata jsou:

Další věc, kterou musíme udělat, je podívat se na další bloky textu šifry, abychom zjistili odpověď na následující otázku:

  • Jsou všechny texty šifry stejné délky, dokonce i pro různé vstupní délky?

Pokud ne všechny bloky mají stejnou délku, nehledáte hashovací algoritmus, ale šifrovací. Protože výstupem bude vždy násobek velikosti základního bloku, přítomnost bloku, který není rovnoměrně dělitelný 16 bajty, by znamenala, že to nemůže být AES, a proto musí být DES nebo 3DES).

Pokud máte možnost zadat heslo a sledovat výstup, lze to zjistit velmi rychle. Stačí zadat 17 znakové heslo a podívat se na jeho délku. Pokud máte 16 bajtů, máte MD5, 20 bajtů znamená SHA-1, 24 bajtů znamená DES nebo 3DES, 32 bajtů znamená AES.

26
Yaur

Pokud je to opravdu hash s jednoduchým heslem, můžeme být schopni pomocí Google jej rozbít . Base64 je však obtížné hledat se všemi těmi lomítky a znaménky plus, takže nejprve převeďme hash na hexadecimální:

$ Perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2

Dobře, nyní můžeme Google za to . V tuto chvíli dostávám pouze jeden zásah , od md5this.com - ačkoliv bude samozřejmě brzy brzy více, včetně tohoto příspěvku.

Bohužel (nebo možná naštěstí, v závislosti na vaší perspektivě), nemáme to štěstí, abychom skutečně našli preimage (web v současné době uvádí tento hash jako „praskání ...“), ale skutečnost, že je na tomto seznamu vůbec, důrazně naznačují, že se skutečně jedná o neschválené hashování skutečného hesla MD5.

6
Ilmari Karonen

Závisí to na formátu - některé protokoly pro ukládání šifrovaného textu mají část s čistým textem, která definuje, jak je šifrována. Z vašeho příkladu pochybuji, protože řetězec, který odkazujete, je tak krátký, že vypadá, že se jedná pouze o šifrovaný text.

Navrhl bych několik myšlenek:

  • "==" na konci by rozhodně bylo čalounění, takže to nezahrnujte do žádných pokusů o dešifrování.

  • Možná se zabýváte hashem nebo solným hashem, spíše než šifrováním. V takovém případě se pokus o „dešifrování“ dat nebude fungovat - je třeba porovnat hesla pomocí stejné hodnoty hash a/nebo soli, která byla původně použita. Neexistuje způsob, jak pomocí soleného hesla získat původní hodnotu.

  • Vaše absolutně nejlepší sázka je získat kopii kódu, který se používá k ukládání hesel. Někde tam hesla procházejí kryptografickou operací. Najděte kód a zjistěte, co se zde děje. 9krát z 10, používají nějaký druh API pro hašování/solení/šifrování a můžete napodobit nebo převrátit pomocí stejného API.

6
bethlakshmi

Kódování lze obecně odhadnout. Například řetězec, který jste vložili do své otázky, je zakódován v Base64. Znaky se rovnají čalounění ve schématu Base64. To je něco, co vím na dohled ze zkušenosti.

Pokud jste mi dali řetězec, který byl zašifrovaný, možná vám budu moci říct kódování, ale nedokážu vám říct algoritmus použitý k jeho zašifrování, pokud není k dispozici nějaký druh metadat. Důvod je tento: šifrovací algoritmy fungují tak, že vytvářejí náhodná data. Kdybych zašifroval dvě věty, každá se dvěma šifry (čtyři výstupy), nemohl byste mi s jistotou říci, který ciphertext patří ke které šifře, pokud jste ji nešifrovali nebo ji nezlomili.

Pokud jde o konkrétní případ, hesla jsou obvykle hashována. To znamená, že nemůžete obnovit heslo z hash, ale můžete vyzkoušet, zda hash odpovídá heslu. V tomto ohledu je @ johnova odpověď zlatá. Pokud můžete zadat heslo, které znáte a zkusit proti němu společná schémata, můžete se naučit, co je hash.

6
Jeff Ferland

Jediným způsobem je hádat. Díky zkušenostem budou odhady správnější.

Například: Na základě délky výstupu: Výstup MD5 je 128 bitů nebo 16 bajtů, výstup SHA1 je 160 bitů nebo 20 bajtů. Na základě znakové sady výstupu: BASE64 vytváří výstup s tisknutelnými znaky.

Na konci dne je to způsob, jak vás vyzkoušet.

4
Nam Nguyen

Toto je velmi slabá bezpečnost na všech frontách! Obyčejný text je P4 $$ w0rdP4 $$ w0rd a je šifrován pomocí šifrování XOR, s klíčem CdZ4MLMPgYtAE9gQ80gMtg ==. ciphertext zveřejněný OP výše, WeJcFMQ/8 + 8QJ/w0hHh + 0g ==.

Potvrdit:

Nejprve pomocí xxd získejte základní binární prostý text:

echo -n 'P4$$w0rdP4$$w0rd' | xxd -b -c16

Výsledkem je:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100

Dále, base64 dekódujte klíč a pomocí xxd získejte základní binární klíč:

echo -n 'CdZ4MLMPgYtAE9gQ80gMtg==' | base64 -d | xxd -b -c16

Výsledkem je:

00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110

Nyní XOR= dva binární řetězce:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  (plaintext)
[XOR]
00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  (key)
-----------------------------------------------------------------------------------------------------------------------------------------------
01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010  (ciphertext)

Nakonec pomocí bc, xxd a base64 převeďte binární ciphertext na base64:

echo "obase=16; ibase=2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010" | bc | xxd -p -r | base64

Tím vznikne WeJcFMQ/8 + 8QJ/w0hHh + 0g ==, což je šifra, kterou OP zveřejnil ve výše uvedené otázce.


Omlouvám se, pokud se tato odpověď zdá být vymyšlená. Je pravda, že ano. Otázky podobné tomuto, kde plakát poskytuje pouze nějaký ciphertext, a žádá o některé informace o tom, jak by mohl být tento ciphertext vytvořen, se zdají být na security.stackexchange.com poměrně časté; a tato otázka je často označována jako duplikát. Smyslem této odpovědi je ukázat, že otázky tohoto druhu jsou nezodpověditelné, protože existuje nekonečná řešení těchto typů otázek.

1
mti2935

Jediný způsob je, když existují nějaká metadata, která vám řeknou. Například jsem v poslední době pracoval s PDF a tento formát obsahuje slovník obsahující filtr, algoritmus, velikost klíče atd. Ale pokud vše, co máte, je šifrový text, pak vše, co máte, je nějaký neprůhledný blok data.

1
user185