У нас есть таблица базы данных, которая содержит пароли, хэшированные с помощью 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.
Правильно ли я поступаю?Почему я получаю другой хэш?