NT Password hash generálás PHP-ból

Hello!

Szeretném megvalósítani PHP-ban az NT password hash generáló algoritmust, ennyit találtam róla:

The Windows NT hash is created by taking the user's password as represented in 16-bit, little-endian UNICODE and then applying the MD4 (internet rfc1321) hashing algorithm to it.

Ezt megcsináltam, http://my-tools.net/md4php/ ezzel az md4 függvénnyel, és az iconv függvénnyel (UTF-8 --> UTF-16), de rossz hash-t generál a programom (pontosabban van egy jó hash, amit ismert jelszóból álított elő a samba megfelelő utilja, ezt próbálom reprodukálni)

Jól tudom hogy azonos jelszóhoz mindig azonos NT hash tartozik?

Petya

Hozzászólások

Nyilvan egy jelszobol mindig ugyanazt a hasht generalja.

Milyen processzoron csinalod a dolgot? Ugyanis nem mindegy az endianness. Figyelni kell arra, h little endian legyen (x86 procik ilyenek).

UTF-16LE helyett eseteg UCS-2LE kodolassal is megprobalkozhatsz (bar **elvileg** ugyanaz.)

- Azonos jelszóhoz azonos hash tartozik mindig, nincs "sózva" a jelszó (ez az egyik gyengesége az NT4 jelszónak)
- Az iconv kimenő kódolása UTF16? Mert az lehet hogy odarak elé egy BOM-ot (Byte Order Mark), legalábbis a parancssori iconv az odateszi, én kipróbálnám az UTF16LE (Little Endian) kódolással, parancssorból ez jó.

Kipróbáltam LE-vel is, a kimenet változatlan.

Most a perl-es megoldást próbálom. A PHP-be integrálás nem megy, mert nincs PECL a gépen, és forrásból nem szeretném feltenni. Próbáltam így: http://molnarp.pastebin.co.uk/18541 http://molnarp.pastebin.co.uk/18546 egy howto alapján, de ez sem működik. Valaki eseteg tudja mi lehet a hiba? Végső esetben exec-cel futtatom le a PERL scriptet, de az azért elég ronda megoldás...

Petya

Az eredeti php-s próbálkozásra gondoltam...Na mind1, kipróbáltam az általad linkelt md4 generálót, de nem az igazi. mhash-md4 viszont teljesen jó!
Ez működik:



#!/usr/bin/php

<?

  $pass=$_SERVER['argv'][1];
  $ntpasswd = mhash(MHASH_MD4, iconv('UTF8','UTF16LE',$pass));

  print(bin2hex($ntpasswd));

?>

Hát akkor a perles szenvedés helyett inkább vagy kijavítanám-újraírnám az MD4-et php-ban, vagy reportolnám az ukrán faszinak, hogy valami nem jó az implementációjában...
Elég könnyen lehet test-caset csinálni:


require 'md4.php';

$pass='abcdefg';
$h1 = bin2hex(mhash(MHASH_MD4, $pass));
$h2 = md4($pass);

print("$h1\n$h2\n");

Wikipedia: http://en.wikipedia.org/wiki/Password_cracking#Salting

Since the salt is usually different for each user, the attacker can no longer construct tables with a single encrypted version of each candidate password. Early Unix systems used a 12-bit salt. Attackers could still build tables with common passwords encrypted with all 4096 possible 12-bit salts. However, if the salt is long enough (e.g. 32 bits), there are too many possibilities and the attacker must repeat the encryption of every guess for each user.

Várj, most lehet, hogy nem jól értelmezem, de akkor most a cracker a hash-sel próbálkozik, és a salt itt azért jó (tudom, mi a salt), mert azt figyelembevéve kell meggenerálni a lehetséges password hashek listáját, és az így sokkal nagyobb lesz? Nem elég erre a megfelelő hashing algoritmus?
It doesn't matter if you like my song as long as you can hear me sing

Nem maga a hash a salted, hanem a jelszó, és ebből van kreálva a hash.
Tehát hash(jelszó+salt) - így ha több usernek is ugyanaz a jelszava, a támadó a jelszavakat látva nem tud arra következtetni, hogy több usernek is ugyanaz a jelszava :)

egyszeru pelda:

belenezel a hash-eket tarolo fajlba es latod, hogy ket has megegyezik, az egyik a te jelszavadhoz van... es akkor mar tudod is a masik jelszavat

ez a legdurvabb gyengesege :)

--
Those who do not understand Unix are condemned to reinvent it, poorly. (based on true story)