Решено - почему ответ от AES_DECRYPT только отображает ????? символы с mysql дБ? - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь заставить AES_ENCRYPT / AES_DECRYPT работать с mySql 5.7, чтобы иметь возможность шифровать пароли. Но мой текст ответа всего лишь ????

У меня есть таблица «personal», и я создал столбец с именем thepassword и установил для него значение VARBINARY (256).

Я не знаю, имеет ли какое-либо отношение подключение / драйвер к моей БД, но вот оно.

strConn = "driver={MySQL ODBC 3.51 Driver};server=localhost;uid=xxxx;pwd=xxxx;database=xxxx;option=3" 
set conn = Server.CreateObject("ADODB.Connection")
conn.Open strConn 

И это страница asp classi c, где я впервые вставляется с этим.

sql= "INSERT into personal (name, thepassword) VALUES ('Bob',AES_ENCRYPT('testar encrypt texten', 'mypasskey2018'));"
conn.Execute (sql)

И это создает большой двоичный объект в столбце пароля.

И вот как я его выбираю.

sql2 = "SELECT AES_DECRYPT(thepassword,'mypasskey2018')  AS passw FROM personal"
set rs2 = conn.Execute (sql2)

do until rs2.eof
    response.write rs2("passw")
rs2.movenext
loop

И он отображает много "?????????? n"

Но если Я использую mySqlWorkBench и запускаю SELECT AES_DECRYPT(thepassword,'mypasskey2018') AS passw FROM personal, затем он выбирает и отображает столбец passw, и я вижу правильное значение.

Так почему я получаю ?????????? n, когда пытаюсь чтобы отобразить его на моей. asp странице?

Любой вклад действительно приветствуется, спасибо.

решено - Хорошо, так что я наконец решил это. Мне пришлось использовать CONVERT USING UTF8 в моем выборе, как это. Так что теперь он отображает значение из столбца пароля в виде текста.

select *,CONVERT(AES_DECRYPT(thepassword,'mypasskey2018' ) USING utf8) AS passw from personal

1 Ответ

0 голосов
/ 07 марта 2020

Для того чтобы исправить «???» на реальном тексте, вам может потребоваться изменить настройки терминала, чтобы они принимали utf-8 (эта процедура зависит от vim, emacs и putty). Это покажет значения, например, так:

select AES_ENCRYPT('testar encrypt texten', 'mypasskey2018');

+-------------------------------------------------------+
| AES_ENCRYPT('testar encrypt texten', 'mypasskey2018') |
+-------------------------------------------------------+
| ▒Xv^▒y▒▒▒▒v▒G▒▒▒▒:▒'▒▒Η▒РG'                           |
+-------------------------------------------------------+

Но чтобы выбрать читаемое значение VARBINARY в MySQL, не забудьте использовать HEX(). Например:

select HEX(AES_ENCRYPT('testar encrypt texten', 'mypasskey2018'));

+------------------------------------------------------------------+
| HEX(AES_ENCRYPT('testar encrypt texten', 'mypasskey2018'))       |
+------------------------------------------------------------------+
| 05D758765EA5798296E3B5D876A24788A3F606A03A95278CFFCE97ADD0A04727 |
+------------------------------------------------------------------+

В зависимости от того, что вы делаете, вам может вообще не понадобиться HEX(), но по крайней мере с этим вы сможете увидеть точные данные, которые на самом деле хранятся там в шестнадцатеричном формате.

Если вы не уверены, работает ли он, проверьте выбор для расшифровки зашифрованного значения. Мне кажется, это работает:

select AES_DECRYPT(AES_ENCRYPT('testar encrypt texten', 'mypasskey2018'), 'mypasskey2018');

+-------------------------------------------------------------------------------------+
| AES_DECRYPT(AES_ENCRYPT('testar encrypt texten', 'mypasskey2018'), 'mypasskey2018') |
+-------------------------------------------------------------------------------------+
| testar encrypt texten                                                               |
+-------------------------------------------------------------------------------------+

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

SELECT * FROM User WHERE User.Password = PASSWORD($user_input);

В этом смысле, если пароль «крутой», мне не нужно беспокоиться ни об этом, ни о чем хэши или шифрует. Я могу просто выбрать с помощью этих средств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...