Преобразование хеш-текста MS SQL в хеш-текст Postgres - PullRequest
0 голосов
/ 14 сентября 2018

Я работаю над переносом всех наших баз данных с сервера 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.

Итак, я просто хочу знать, есть ливозможность следующих решений?

  1. Преобразовать шестнадцатеричное значение, сгенерированное в MS SQL, в шестнадцатеричное значение, эквивалентное сгенерированному с использованием типа данных VARCHAR (который является тем же значением в Postgres)
  2. Преобразовать тексты UTF8 вUTF16 пишет на Postgres (даже с любым расширением) и генерирует шестнадцатеричные значения, которые будут эквивалентны значениям, сгенерированным в MS SQL

1 Ответ

0 голосов
/ 14 сентября 2018

Давайте посмотрим на ваши предложения по очереди:

  1. Преобразование шестнадцатеричного значения, сгенерированного в MS SQL, в значение в шестнадцатеричном формате, эквивалентное значению, созданному с использованием типа данных VARCHAR (то же самое значение в Postgres)

Это сводится к преобразованию пароля пользователя из UTF-16 в UTF-8 (или к другой кодировке) и его повторному хэшированию. Для этого вам нужно знать пароль пользователя, который теоретически вам не нужен - в этом и заключается смысл хеширования его.

На практике вы используете несоленые хэши SHA1, для которых существуют большие предварительно вычисленные таблицы и для которых грубая сила возможна с помощью алгоритма, оптимизированного для GPU. Таким образом, опция «серая шляпа» будет заключаться в том, чтобы взломать все пароли вашего пользователя и заново их хешировать.

Если вы сделаете это, вероятно, было бы целесообразно повторно хэшировать их, используя соль и лучшую хеш-функцию, а также конвертировать их в UTF-8.

  1. Преобразование текстов UTF8 в тексты UTF16 в Postgres (даже с любыми расширениями) и генерирование шестнадцатеричных значений, которые будут эквивалентны значениям, сгенерированным в MS SQL

Теоретически это проще, вам просто нужна подпрограмма для преобразования строк. Однако, как вы обнаружили, в Postgres нет встроенной поддержки для этого.

Для любой строки, состоящей полностью из символов ASCII, преобразование тривиально: вставьте нулевой байт (шестнадцатеричный 00) перед каждым байтом строки. Но это сломает любой пароль, который использовал символ, не входящий в этот диапазон.

Альтернативой может быть передача ответственности за генерацию хеша из базы данных:

  1. Получить хеш из БД.
  2. Убедитесь, что пользовательский ввод представлен как UTF-16 в вашем приложении, и вычислите его хеш.
  3. Если он действителен, теперь вы можете сгенерировать новый хеш (поскольку вы знаете пароль, который пользователь только что набрал), используя лучший алгоритм, и сохранить его в БД вместо старого хеша.
  4. Как только все активные пользователи вошли в систему хотя бы один раз, у вас не останется хешей SHA1, и вы сможете полностью удалить их поддержку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...