2010-08-18 5 views
1

J'essaye de convertir cette fonction en PHP mais de toute façon elle ne donne pas les mêmes résultats.Essayer de porter la fonction C# à PHP5

public static string EncodePassword(string pass, string salt) { 
    byte[] bytes = Encoding.Unicode.GetBytes(pass); 
    byte[] src = Convert.FromBase64String(salt); 
    byte[] dst = new byte[src.Length + bytes.Length]; 
    byte[] inArray = null; 
    Buffer.BlockCopy(src, 0, dst, 0, src.Length); 
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); 
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 
    inArray = algorithm.ComputeHash(dst); 
    return Convert.ToBase64String(inArray); 
} 

C'est mon opinion à ce sujet dans PHP

function CreatePasswordHash($password, $salt) { 
    $salted_password = base64_decode($salt).$password; 
    $result = hash('SHA1',$salted_password,true); 
    return base64_encode($result); 
} 

Et bien sûr, cela ne fonctionne pas. Alors qu'est-ce que je fais mal ici?

Ce sont les valeurs pour le test:

$salt   = 'Xh2pHwDv3VEUQCvz5qOm7w=='; 
$hashed_value = '0U/kYMz3yCXLsw/r9kocT5zf0cc='; 
$password  = 'Welcome1!'; 

if ($hashed_value === CreatePasswordHash($password,$salt)) { 
    echo "Good job!"; 
} 

Edit: solution de travail en fonction des suggestions de Martyx et Slacks

function CreatePasswordHash($password, $salt) { 
    $upass = mb_convert_encoding($password,'UCS-2LE','auto'); 
    $salted_password = base64_decode($salt).$upass; 
    $result = hash('SHA1',$salted_password,true); 
    return base64_encode($result); 
} 

Répondre

2

Une fois que je SHA1 en PHP et C# et en lettres de sortie C# ont été en majuscule et en PHP c'était en minuscules.

Je recommande d'utiliser le même encodage en C# et en PHP (UTF8 et UTF16 sont de bons choix).

choix en C#:

  • Encoding.ASCII.GetBytes
  • Encoding.UTF8.GetBytes
  • ...

encodage PHP:

+0

Votre suggestion était sur place. J'avais besoin de convertir le mot de passe en unicode et que cela produisait le bon résultat. Merci mec! –

2

Vous devez indiquer à PHP de coder la chaîne de mot de passe en utilisant UTF16 et le sel en octets bruts.

Questions connexes