Newsgroup: it.comp.www.php
Titolo: sha1 encrypt

Ciao a tutti,
vi espongo subito il mio problema.
Su un campo di una tabella di un database mysql ho una serie di password 
criptate.
Classica procedura di login: la mia applicazione php dovrebbe effettuare 
un match di queste password con delle stringhe inviate via post dagli 
utenti.
Queste password sono state importate da una precedente applicazione 
scritta in ".net" e gli sviluppatori di questa applicazione hanno 
fornito la seguente funzione che utilizzavano per l'encrypt di quelle 
password
	public static string EncryptPassword(string password)
  	{
		UnicodeEncoding encoding = new UnicodeEncoding();
    		byte[] hasBytes = encoding.GetBytes(password);
    		SHA1 sha1 = new SHA1CryptoServiceProvider();
    		byte[] cryptPassword = sha1.ComputeHash(hasBytes);
   		return Convert.ToBase64String(cryptPassword);
	}
So di per certo che dando in pasto a questa funziona la stringa 
"manuelb" ottengo "DhQiZ5+jY7NgvCXW0NQVJrvKkEk="
Forte di queste informazioni (e purtroppo non conosco affatto .net) mi 
sono messo lì e con la documentazione in php ho cercato di scrivere la 
funzione che faccia lo stesso lavoretto.
Di seguito vi è la funzione che ho cercato di implementare. Le righe 
commentate sono quelle "equivalenti" in .net nel mio tentativo...
Purtroppo però mi sono fermato a quanto segue:
	function encryptPassword($password)
	{
		// UnicodeEncoding encoding = new UnicodeEncoding();
    		// byte[] hasBytes = encoding.GetBytes(password);
    		   $hasBytes = mb_convert_encoding($password, "UNICODE", 
mb_detect_encoding($password));
 
    		//SHA1 sha1 = new SHA1CryptoServiceProvider();
    		//byte[] cryptPassword = sha1.ComputeHash(hasBytes);
    		  $cryptPassword = sha1($hasBytes, true);
 
    		//return Convert.ToBase64String(cryptPassword);
    		  return base64_encode($cryptPassword);
	}
Tuttavia adesso
	echo encryptPassword("manuelb");
mi torna purtroppo "4YH3Osshf1mbRLHDhl97kGwofnU=" (e non il valore che 
invece ritrona la funzione in .net - vedi sopra).
A questo punto sono certo che da qualche parte sbaglio, e ritengo 
probabile di aver fatto qualche casino nella parte relativa alla 
codifica Unicode... ma non riesco proprio a capire come risolvere e far 
si che il valore ritornato dall'encrypt in php sia lo stesso di quello 
avuto dalla funzione in .net.
Ringrazio con un inchino a chiunque vorra aiutarmi :-)
Un caro abbraccio
Mauro

"manuelb" ottengo "DhQiZ5+jY7NgvCXW0NQVJrvKkEk="
Windows codifica le stringhe a modo suo. Per simulare la stessa codifica
non devi usare UNICODE, ma "UTF-16LE".
Se non ce l'hai e magari usi PHP 4, che ha uno sha1 hex-only, tocca fare
un giro che la meta' basta, e che ti allego.
Fammi sapere come va - soprattutto per le accentate, che sono sempre una
dannazione.
        function hex2ascii($str)
        {
                $p = '';
                for ($i=0; $i < strlen($str); $i=$i+2)
                        $p .= chr(hexdec(substr($str, $i, 2)));
                return $p;
        }
        function encryptPassword($password)
        {
                $chars  = 2*strlen($password);
                $string = mb_convert_encoding($password, 'UTF16',
'ASCII');
                $bytes  = unpack("C$chars", $string);
                $setyb  = '';
                while(!empty($bytes))
                {
                        $odd    = array_shift($bytes);
                        $even   = array_shift($bytes);
                        $setyb  .= sprintf("%02x%02x", $even, $odd);
                }
                $gnirts = pack("H*", $setyb);
                $sha1   = sha1($gnirts);
                $bin    = hex2ascii($sha1);
                return base64_encode($bin);
        }
Leonardo salvo errori ed omissioni
--
The stars have not dealt me the worst they could do:
My pleasures are plenty - my troubles are two.
But oh!, my two troubles, they reave me of rest:

Ciao Leonardo,
ti ringrazio infinitamente. I risultati sembrano confermarmi che e' 
proprio ciň di cui avevo bisogno.
Per la questione degli accenti, non ho possibilitŕ al momento di 
conoscere password accentate corrispondenti ai crypt di cui ora 
dispongo... se avro' la possibilitŕ di fare un matching te lo riferirň!
:-)
Grazie ancora
Mauro
Leonardo Serni ha scritto:
