Portál AbcLinuxu, 25. dubna 2024 03:58


Dotaz: Hash algoritmy a kódování utf8/unicode

14.2.2011 20:30 heš
Hash algoritmy a kódování utf8/unicode
Přečteno: 1030×
Odpovědět | Admin
Dobrý den. Jsem trochu zmatený co se týče toho,jak různé znakové sady ovlivňují výstupy algoritmů. Zkoušel jsem v php vytvářet NTLM hash, pro ten musí být vstupní řetězec v UTF16-LE, tam je to celkem jasné. Ale co třeba MD5? Znamená to že MD5 bude jiný v UTF8 a třeba v CP1250 pro určité znaky? To znamená že musím omezit vstupní sadu znaků na ty které podporuje to "nejnižší" používané kódování nebo jak to je?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.2.2011 20:52 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode
Odpovědět | | Sbalit | Link | Blokovat | Admin

MD5 je algoritmus, který dostane na vstup posloupnost bytů (délky od 0 do 2^64-1) a vypadne z něj 128-bitový digest. Pokud chcete spočítat MD5 digest řetězce, pak samozřejmě záleží na tom, jaké použijete kódování, protože kódování je právě přepis do té posloupnosti bytů.

mike@lion:~> echo -n řeřicha | od -t x1
0000000 c5 99 65 c5 99 69 63 68 61
0000011
mike@lion:~> echo -n řeřicha | md5sum -
c5230b32ea6d06cffae51de21f90747a  -
mike@lion:~> echo -n řeřicha | iconv -f utf-8 -t iso-8859-2 | od -t x1
0000000 f8 65 f8 69 63 68 61
0000007
mike@lion:~> echo -n řeřicha | iconv -f utf-8 -t iso-8859-2 | md5sum -
71aa885c53c9a9d69d88f0c1db61c4ef  -
To znamená že musím omezit vstupní sadu znaků na ty které podporuje to "nejnižší" používané kódování nebo jak to je?

To je jedna možnost. Druhá, IMHO vhodnější, je zvolit si jedno preferované kódování (např. UTF-8) a dostanete-li vstup v jiném, převést ho nejdřív na to preferované.

14.2.2011 21:55 heš
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode

Druhá, IMHO vhodnější, je zvolit si jedno preferované kódování (např. UTF-8) a dostanete-li vstup v jiném, převést ho nejdřív na to preferované.

No jenže já právě nevím jaké je to preferované. Mám jednoduchý skript v php, kterým měním hesla do různých webových aplikací (využívajících mysql databázi). Problém je že já v některých případech nemohu zjistit v jakém kódování ta potenciální aplikace ukládá hesla a já potřebuju, aby hesla vytvořená mým skriptem tyto konkrétní aplikace "přečetly" a dobré by bylo aby to šlo i naopak (aplikace vytvoří v cp1250 md5 hash a já ho svým skriptem ze vstupních znaků v utf8 dokážu vytvořit také). To asi možné nebude že? Dalo by se to vyřešit tím, že bych povolil jen určité znaky? Jsou shodné ve všech kódováních bitové reprezentace pro všechny alfanumerické anglické znaky?
14.2.2011 22:56 kuka
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode
Nejsou. Nicmene pokud se omezis na nejakou mnozinu kodovani tak to pujde. Napr. win-1250, iso-8859-2 a UTF-8 maji pro anglicke alfanumericke znaky stejne kody.
15.2.2011 02:15 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode
Pokud potřebujete kompatibilitu s konkrétní aplikací, musíte hash počítat přesně tak, jak to dělá ta aplikace, s tím prostě nehnete. Což mimo jiné znamená, že "MD5" pravděpodobně ve skutečnosti nebude skutečná MD5, ale jakýsi komplikovaný algoritmus, který MD5 pouze využívá.
15.2.2011 04:28 heš
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode
Konkrétně MD5 a SMD5 je stejně implementované jako třeba v openldapu tzn. md5=md5 hash v base64 formátu, smd5=md5(heslo.salt).salt to celé v base64.
15.2.2011 09:27 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode
OpenLDAP AFAIK používá totéž co crypt(), tj. to, čemu se sice říká MD5, ale ve skutečnosti to není MD5 digest hesla (ani hesla+salt).
15.2.2011 14:55 heš
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode
Podporuje víc formátů, pro MD5: http://www.openldap.org/faq/data/cache/418.html. Jen tak mimo hashe v OpenLDAPu jsou taky závislé na znakové sadě generujícího systému? Není někde podle RFC určeno v jakém charsetu musí být hashe generovány?
15.2.2011 15:19 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode
Dokud si nepřečtete a nepokusíte se pochopit, co vám tu píšeme, nemá další vysvětlování smysl.
15.2.2011 18:08 heš
Rozbalit Rozbalit vše Re: Hash algoritmy a kódování utf8/unicode
Já chápu, že hashovací fce pracují s binárním vstupem, tím pádem i v LDAPu budou pro různé zn. sady různé hashe. Jen mě zajímalo jestli není dáno normou, že hashe se do ldapu musí vytvářet právě tím kódováním. Přeci jenom pokud vytvořím v UTF-16 MD5 heslo a vložím do ldapu, tak mi nemusí projít bind s tím heslem. Jak se vlastně určuje kódování komunikace mezi klientem a LDAPem příp. vnitřní kódování v LDAPu?

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.