Я работаю над переносом всех наших баз данных с сервера MS SQL на Postgres.В этом процессе я работаю над написанием эквивалентного кода в Postgres, чтобы получить те же хешированные тексты, полученные в MS SQL.
Ниже приведен мой код в MS SQL:
DECLARE @HashedText nvarchar(50)
DECLARE @InputText nvarchar(50) = 'password'
DECLARE @HashedBytes varbinary(20) -- maximum size of SHA1 output
SELECT @HashedBytes = HASHBYTES('SHA1', @InputText)
SET @HashedText = CONVERT(nvarchar(50), @HashedBytes, 2)
SELECT @HashedText
Это дает значение E8F97FBA9104D1EA5047948E6DFB67FACD9F5B73
Ниже приведен эквивалентный код, написанный на Postgres:
DO
$$
DECLARE v_InputText VARCHAR = 'password';
DECLARE v_HashedText VARCHAR;
DECLARE v_HashedBytes BYTEA;
BEGIN
SELECT
ENCODE(DIGEST(v_InputText, 'SHA1'), 'hex')
INTO
v_HashedBytes;
v_HashedText := CAST(v_HashedBytes AS VARCHAR);
RAISE INFO 'Hashed Text: %', v_HashedText;
END;
$$;
Это дает значение 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
.
Потратив некоторое время, я понял, что замена типа данных 'NVARCHAR' на 'VARCHAR' в MS SQL дает тот же результат, что и Postgres.
Теперь проблема в MS SQL, у нас уже есть хэши паролей ихранится в базе данных, как показано выше.Я не могу преобразовать хэшированный текст в MS SQL в Postgres, а также не могу генерировать тот же хэшированный текст в Postgres, так как Postgres не поддерживает Unicode UTF-16.
Итак, я просто хочу знать, есть ливозможность следующих решений?
- Преобразовать шестнадцатеричное значение, сгенерированное в MS SQL, в шестнадцатеричное значение, эквивалентное сгенерированному с использованием типа данных VARCHAR (который является тем же значением в Postgres)
- Преобразовать тексты UTF8 вUTF16 пишет на Postgres (даже с любым расширением) и генерирует шестнадцатеричные значения, которые будут эквивалентны значениям, сгенерированным в MS SQL