Сравнение соли, сгенерированной в Oracle против C # - PullRequest
0 голосов
/ 07 декабря 2018

У нас есть таблица базы данных, которая содержит пароли, хэшированные с помощью SHA512.Когда пользователь входит в систему, он сравнивает введенный им хешированный пароль с хешированным паролем, хранящимся в таблице.Я пытаюсь создать пользователя с помощью сценария PL / SQL, и мне нужно повторить тот же процесс, что и система, чтобы создать пользователя, когда он делает это через интерфейс.

У меня проблемы с разъяснениемесли соль, которую я генерирую для хэша в Oracle, это то, что генерируется системой в C #.Поскольку, когда я пытаюсь войти в систему и отлаживать системный код, сгенерированный системой хешированный пароль не совпадает с тем, что я создал с помощью своего сценария PL / SQL.

В настоящее время система генерирует хэш с помощью:

public string GetSalt(int count) // count = 32
{
    byte [] salt = new byte[count];
    using (var gen = new RNGCyptoServiceProvider()) // System.Security.Cryptography
    {
        gen.GetBytes(salt);
    }
    return Convert.ToBase64String(salt);
}

Таким образом, мы должны получить криптографически стойкую последовательность случайных значений, основанную на документах для GetBytes().

В Oracle я делаю следующее:

FUNCTION GetSalt RETURN SomePasswordTable.Salt%TYPE IS
    defaultSaltLength   VARCHAR2(4);
    randomBytes RAW(1024);
BEGIN
    BEGIN
        SELECT SaltLength
        INTO defaultSaltLength -- This will be '32'
        FROM SomeTable
        WHERE someValue = 1
            AND someOtherValue = 'SALTLN';
    EXCEPTION
        WHEN OTHERS THEN
            defaultSaltLength := '32';
    END;

    randomBytes := DBMS_CRYPTO.RandomBytes(TO_NUMBER(defaultSaltLength));

    RETURN utl_raw.cast_to_varchar2(utl_encode.base64_encode(randomBytes));
END;

У меня такой вопрос: я делаю в Oracle то же самое, что и система в C #?

На основе Oracle DBMS_CRYPTO docs , RandomBytes()также должен вернуть мне криптографически безопасную псевдослучайную последовательность байтов.

Поскольку оба метода используют одну и ту же хэш-функцию.DBMS_CRYPTO.HASH_SH512 в Oracle и PBKDF2HashAlgorithm.SHA512 в C #, это единственное место, где я могу думать о том, где хэширование происходит неправильно на стороне Oracle.

Правильно ли я поступаю?Почему я получаю другой хэш?

...