Как проверить пароль с Rfc2898DeriveBytes шифрованием?

164
01 июня 2018, 20:40
public string HashPassword(string password)
    {
        byte[] salt;
        byte[] buffer2;
        if (password == null)
        {
            throw new ArgumentNullException(nameof(password));
        }
        using (var bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8))
        {
            salt = bytes.Salt;
            buffer2 = bytes.GetBytes(0x20);
        }
        var dst = new byte[0x31];
        Buffer.BlockCopy(salt, 0, dst, 1, 0x10);
        Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20);
        return Convert.ToBase64String(dst);
    });

Каждый раз выдает разные хеши, но как тогда проверить два пароля один из базы где храниться хешированным этим методом и один с пользователя даже переменные salt разные при каждом вызове

Этот код c# с сервера где не мы это делали, и нам на своем сервер на python\django нужно проверить посредством python полученный хеш с сервера на c#, для это я нашел либу pbkdf2

from pbkdf2 import PBKDF2
import base64
password_hash=b"ACNLVsim8ADv4Su/8w4loeSwTw2yH2R3++Pvrfx5xlDGlx0cDRdQ9t0TLJd1a5pvZw=="
password = b"123456"
# Соль
origin_salt = base64.b64decode(password_hash)[1:16]
print(base64.b64encode(origin_salt))
# > I0tWyKbwAO/hK7/zDiWh
buffer1 = base64.b64decode(password_hash)[17:]
print(base64.b64encode(buffer1))
# > sE8Nsh9kd/vj7638ecZQxpcdHA0XUPbdEyyXdWuab2c=
current_password_hash = PBKDF2(password, origin_salt, 1000)
# Соль
print(base64.b64encode(current_password_hash._PBKDF2__salt))
# > I0tWyKbwAO/hK7/zDiWh

print(base64.b64encode(current_password_hash.read(49)[17:]))
# > 0lC99e4tV+JmXBbJal19YyS1h9+djY+dsBHo/j8KNb8=

выдает одинаковые значение при каждом вызове, не то что на c#

Answer 1

C# код каждый раз создает разный salt (случайный), по этому пароли каждый раз другие. Вам нужно прочесть первые 16 байт пароля с C# (здесь записан salt), и подставить в python. Потом проверить оставшиеся 32 байта.

Answer 2

Все получилось, оказывается мы пытались взять 32 байта срезом, а надо было генерить только на 32 байт и этот сравнивать с buffer2 с с# Спасибо большое @Zergatul

from pbkdf2 import PBKDF2
import base64
password_hash = b"AFBYUNpzMbvIHJWLmleAXWITetOsWOuma+FuPdV7fXogYM/8CVKtGygqzoWam14YXg=="
password = b"123456"
# оригинальный Соль
salt64 = base64.b64decode(password_hash)[1:17]
print(base64.b64encode(salt64))
# > UFhQ2nMxu8gclYuaV4BdYg==
# оригинальный буфер
buffer1 = base64.b64decode(password_hash)[17:]
print(base64.b64encode(buffer1))
# > E3rTrFjrpmvhbj3Ve316IGDP/AlSrRsoKs6FmpteGF4=

key = PBKDF2(password, salt64).read(32) #
print(base64.b64encode(key))
# > E3rTrFjrpmvhbj3Ve316IGDP/AlSrRsoKs6FmpteGF4=
READ ALSO
Парсинг Json при помощи Newtonsoft.Json

Парсинг Json при помощи Newtonsoft.Json

Json который получаю

219
Как работает данная ViewModel?

Как работает данная ViewModel?

Немного не понимаю магию этого кода:

186
Максимальное разрешение экрана

Максимальное разрешение экрана

Сделал свою шапку для окна, и хочу добавить туда стандартные кнопки "свернуть", "развернуть", и "закрыть"Всё как бы хорошо, но при развертывании...

177
Locks и IsolationLevel

Locks и IsolationLevel

У меня есть такой код модуля статистики:

188