Это шифрование, которое я использую, когда люди регистрируются на моем сайте:
$salt = generateSalt();
$hashedPassword = crypt($userPass, $salt);
а вот мой generateSalt
функция:
function generateSalt() {
$salt = uniqid(mt_rand(), true);
$salt = '$1$' . $salt;
return $salt;
}
Когда я шифрую пароль этим, я получаю, например:
$ 1 $ 92999442 $ AK4yZPjnj6BKc9yj4CXKu1
Но когда я шифрую тот же пароль на C # с этой функцией:
hashedPassword = GenerateMD5(uName, salt);
Функция GenerateMD5:
public String GenerateMD5(String input, String salt)
{
Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
System.Security.Cryptography.MD5Cng md5hashstring = new System.Security.Cryptography.MD5Cng();
byte[] hash = md5hashstring.ComputeHash(bytes);
string hex = BitConverter.ToString(hash).Replace("-", string.Empty);
return hex;
}
Я получаю совершенно другой вывод. С тем же паролем и той же солью я получаю этот вывод:
9DE11D48C3F7DF1BF89FC76D755A2596
Какую функцию я должен использовать в PHP и C #, чтобы получить одинаковый вывод?
Потому что вы используете два совершенно разных алгоритма. В PHP вы используете crypt()
который использует DES, а в C # вы используете MD5. Они никогда не будут производить тот же результат. Если вы хотите такой же вывод, вы должны использовать md5()
в PHP вместо crypt()
Кроме того, не используйте MD5, это устарело. Вы должны использовать по крайней мере SHA-2 сейчас
и добавление случайной соли к вашему входу является частью их проблемы. каждый раз вы будете получать разные входные данные, следовательно, разные выходные данные хешей.
На вашем месте я бы подумал об использовании password_hash вместо. Делает все это crypt
работать для вас в красивой, аккуратной упаковке, в комплекте со случайной солью.
Что касается того, почему ваша функция не соответствует, вы используете MD5 в своем коде C #. Я не эксперт в C #, но вы должны использовать какую-то систему хеширования bcrypt. Есть bcrypt с открытым исходным кодом для C # это может помочь тебе. Теоретически, поскольку они используют одну и ту же систему, один должен иметь возможность проверять другой, поскольку все они хранят соль в строке. Просто вытащите соль из строки и вставьте пароль и соль в другой, и они должны совпадать.
Это так называется md5crypt Пол-Хеннинг Камп, не путать с MD5. Md5crypt for сначала использовался для защиты паролей FreeBSD от грубой силы, но затем стал более распространенным. Он был включен в GNU libc crypt (), и многие программы имели интерфейсы для этого системного вызова, включая PHP, и некоторые разработчики PHP использовали его. Md5crypt вызывает MD5 не менее 1000 раз, чтобы сделать грубую силу тяжелее (но в настоящее время md5crypt считается его автором устаревшим!). Я видел реализацию md5crypt для многих языков программирования, этот для C #.