Я пытаюсь преобразовать эту функцию в 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); }
Как только я использовал SHA1 в PHP и C #, а в C # выходные буквы были в верхнем регистре, а в PHP – в нижнем регистре.
Я бы рекомендовал использовать ту же кодировку в C # и PHP (UTF8 и UTF16 – хороший выбор).
Выбор в C #:
кодирование PHP:
Вы должны сказать PHP, чтобы кодировать строку пароля, используя UTF16, а соль – как сырые байты.