pbkdf2_sha256 реализация C#

У меня есть база данных, в которой пароли хранятся как pbkdf2_sha256. Я хочу создать инструмент (на С#), который должен создавать новые пароли.

Моя проблема: Как мне зашифровать пароль на C#? Я нашел Java -Class, который у меня работает, но я не могу использовать этот пример в C#. Есть ли аналогичный способ?

Я пробовал и другие классы, но они, похоже, не работают.

EDIT: я нашел этот класс для С#. Но когда я вызываю метод ValidatePassword, он возвращает false. (Пароль и хэш верны).

EDIT2: я также нашел этот класс С#, но он не работает. Что я сделал не так?

Вот код, который я использую:

var salt = "FbSnXHPo12gb";
var password = "geheim";
var interactions = 12000;


using (var hmac = new HMACSHA256())
{
    var df = new Pbkdf2(hmac, password, salt, interactions);
    Console.WriteLine(BitConverter.ToString(df.GetBytes(32)));
    Console.WriteLine(String.ByteArrayToString(df.GetBytes(32)));
    Console.WriteLine(UTF8Encoding.UTF8.GetString(df.GetBytes(32)));
    Console.WriteLine(Convert.ToBase64String(df.GetBytes(32)));
}

//hash I should get: 
//pbkdf2_sha256$12000$FbSnXHPo12gb$LEpQrzPJXMI0m3tQuIE5mknqCv1GWgT5X2rWyLHN0Xk=

//hash I get:
//Rc8oMeSrbWyIJ+aXvGegFowKcIlwk8eIRyxXUf/a+t0=

person Lee    schedule 17.11.2014    source источник
comment
Первый использует SHA1.   -  person CodesInChaos    schedule 18.11.2014


Ответы (2)


Не преобразовывайте шестнадцатеричный вывод в строку с основанием 64, а преобразовывайте в нее байты напрямую. Также обратите внимание, что вы будете получать новые байты при каждом вызове df.GetBytes. Эквивалентный пример:

var salt = "FbSnXHPo12gb";
var password = "geheim";
var interactions = 12000;


using (var hmac = new HMACSHA256())
{
    var df = new Pbkdf2(hmac, password, salt, interactions);
    Console.WriteLine(Convert.ToBase64String(df.GetBytes(32)));
}

//hash I should get: 
//pbkdf2_sha256$12000$FbSnXHPo12gb$LEpQrzPJXMI0m3tQuIE5mknqCv1GWgT5X2rWyLHN0Xk=

//hash I get:
//LEpQrzPJXMI0m3tQuIE5mknqCv1GWgT5X2rWyLHN0Xk=

Обратите внимание, что класс Java имеет заголовок ("pbkdf2_sha256$12000$FbSnXHPo12gb$"), а класс C# возвращает только хэш.

person Josip Medved    schedule 18.11.2014

У меня есть ответвление кода Jither PBKDF2 C# DeriveBytes по адресу мой репозиторий Github, включая вариант PBKDF2-HMAC-SHA-256, большой набор тестовых векторов и интерфейс который генерирует хэши и может проверять результаты, если этот пример вам поможет.

person Anti-weakpasswords    schedule 17.01.2015