Попытка портировать функцию C # на PHP5 - PullRequest
1 голос
/ 19 августа 2010

Я пытаюсь преобразовать эту функцию в PHP, но почему-то она не дает таких же результатов.

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);
}

Это мой взгляд на PHP

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

ИКонечно, это не работает.Так что я тут не так делаю?

Вот значения для тестирования:

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

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

Редактировать: Рабочее решение на основе предложений от Martyx и 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);
}

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Вы должны указать PHP кодировать строку пароля, используя UTF16 и соль как необработанные байты.

2 голосов
/ 19 августа 2010

Как только я использовал SHA1 в PHP и C #, а в C # выходные буквы были в верхнем регистре, а в PHP - в нижнем.

Я бы рекомендовал использовать одну и ту же кодировку в C # и в PHP (UTF8 и UTF16 - хороший выбор).

Выбор в C #:

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

кодировка PHP:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...