Как сгенерировать сообщение AuthenticationMD5Password

#postgresql #protocols #libpq

#postgresql #протоколы #libpq

Вопрос:

Я создаю клиент postgresql в gdscript (вы можете ответить на мой вопрос, даже если вы не знаете, как кодировать в gdscript).

Для этого я использую спецификацию протокола postgresql

Мне удалось связаться с сервером, и он запрашивает у меня «AuthenticationMD5Password», но я не могу идентифицировать себя. Я выполнил процедуру генерации пароля, описанную на странице, но получаю сообщение об ошибке сервера.

с помощью этой формулы sql, которую я адаптировал в gdscript:

 concat('md5', md5(concat(md5(concat(password, username)), random-salt)))
  

С «паролем» значение «тест», «именем пользователя» значение «тест» и «случайной солью» значение «98dec364».

Получаем: md5936597c6b72ab2681ca01dca38b17da0

Я получаю следующую ошибку: Сообщение: ошибка аутентификации по паролю для пользователя «test» SQLSTATE code: 28P01

Похоже, что оно получено из salt, действительно ли формат является exadecimal строкой? Я попытался перевести его в utf8, но это не работает, заранее спасибо.

Ответ №1:

Соль — это не 8 шестнадцатеричных цифр, это 4 байта. Это просто двоичные байты, поэтому у них нет набора символов.

Комментарии:

1. да, но это одно и то же, байты могут иметь значение от 0 до 255 или от 00 до ff. что я делаю, так это просто беру это шестнадцатеричное значение и превращаю его в строку. это то, что находится во фрейме, отправленном сервером. но я не знаю, должна ли соль на самом деле быть шестнадцатеричной строкой или utf8, в любом случае это не работает.

2. Следует ли считать байты числом, строкой utf8, символьной строкой binnar (10010110 …) или просто шестнадцатеричным шифром? Зная, что функция md5 принимает только одну символьную строку в качестве параметра.

3. Из хэша md5, о котором вы сообщаете, вы обрабатываете соль как 8 байтов, которые просто случайно находятся в диапазоне 0-9 и a-f. Вы не рассматриваете их как 4 байта, которые они представляют. Сервер отправляет вам 4 байта, а не 8 байтов из ограниченного диапазона. Вам не нужно ни во что их переводить, вам нужно не переводить их. Похоже, это вопрос о программировании gdscript, с которым я, вероятно, не смогу помочь.

4. хорошо, но внезапно, как я могу определить соль, когда функция md5 принимает строку в качестве параметра или, проще говоря, как объединить строку с байтами? gdscript очень близок к языку python, можете ли вы привести мне пример на python? (извините за все, что я спрашиваю)

5. postgresql.org/docs/current/protocol-message-types.html Согласно этой странице, байты документации должны рассматриваться как символы, но я не могу подключиться при переводе в utf8, потому что преобразование байт -> utf8 не работает. Я тестировал с ascii и получил непечатаемые символы, такие как соль. Это приводит к ошибке сервера, такой же, как определено в моем сообщении.