ramen79 Ответов: 2

Расшифруйте пароль в текстовое поле с помощью AES_DECRYPT


Я могу зашифровать пароль с помощью AES_ENCRYPT в VB.NET 2010 и MySQL, но при попытке получить зашифрованный пароль в текстовое поле с помощью AES_DECRYPT он показывает null.
Пожалуйста, кто-нибудь может помочь мне с недостающим кодом.

Мой код таков....

Что я уже пробовал:

код шифрования:
sql.CommandText = "INSERT INTO users(uid,uname,urole,upwd,mob)VALUES('" & Me.lblUID.Text & "','" & Me.txtUser.Text & "','" & Me.cmbRole.SelectedValue & "', AES_ENCRYPT('" & pwd & "','" & ed & "'),'" & Me.txtPwd.Text & "')"


расшифровка кода, который я пробовал:
comm.CommandText = "SELECT uname,uid,urole FROM users WHERE uid= '" & Trim(Me.txtUID.Text) & "' AND upwd= '" & AES_DECRYPT(Me.txtPwd.Text) & "' "



ФУНКЦИЯ РАСШИФРОВКИ:

Dim cipherBytes As Byte() = Convert.FromBase64String(cipherText)
        Using encryptor As Aes = Aes.Create()
            Dim pdb As New Rfc2898DeriveBytes(EncryptionKey, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _
             &H65, &H64, &H76, &H65, &H64, &H65, _
             &H76})
            encryptor.Key = pdb.GetBytes(32)
            encryptor.IV = pdb.GetBytes(16)
            Using ms As New MemoryStream()
                Using cs As New CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)
                    cs.Write(cipherBytes, 0, cipherBytes.Length)
                    cs.Close()
                End Using
                cipherText = Encoding.Unicode.GetString(ms.ToArray())
            End Using
        End Using
        Return cipherText

Dave Kreskowiak

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

Кроме того, никогда не используйте конкатенацию строк для построения SQL-запроса. Всегда используйте параметризованные запросы для защиты от атак SQL-инъекций. Ваш код в его нынешнем виде можно легко взломать, просто вставив символ ' в идентификатор пользователя или пароль.

F-ES Sitecore

Реализация шифрования, когда ваш код открыт для атак SQL-инъекций, немного бессмысленна. Кроме того, конечно же, вам нужно искать зашифрованную версию текста?

связь.Свойства commandtext = "выбрать команду uname,жидкости,urole от пользователей, где uid= '" &ампер; отделка(меня.txtUID.Текст) &ампер; "' и upwd= в '<это должно быть AES шифрование пароля&ГТ;'"

Однако то, что вы обычно делаете, - это извлекаете пароль, основанный только на идентификаторе, затем шифруете предоставленный пароль и проверяете, соответствует ли зашифрованная версия сохраненной версии.

Richard MacCutchan

На самом деле пароли никогда не должны быть зашифрованы.

F-ES Sitecore

Не в реальном приложении, нет.

Richard MacCutchan

И вы думаете, что эти вопросы не связаны с реальными приложениями? :)

F-ES Sitecore

Нет, это конкретное приложение больше похоже на школьный проект или учебный проект. Вы учитесь чему-то, пробуя, терпя неудачу, а затем исправляясь, так что есть большая выгода в том, чтобы ОП заработал, даже если это не идеальное реальное решение. Если он затем перейдет к хешированию (как уже предлагалось), поскольку он реализовал оба метода, он будет в отличном положении, чтобы действительно понять разницу в методах.

Richard MacCutchan

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

F-ES Sitecore

Я здесь не для того, чтобы изменить мир, а только для того, чтобы отвечать на вопросы, которые мне задают. Может быть, есть причина, по которой пароли должны быть зашифрованы, о которой вы не знаете? Не нам решать, кто "достоин" ответа на свой вопрос, а кто нет.

F-ES Sitecore

Что делает кто-то, помещая незащищенную базу данных на общедоступный Интернет-сервер (извините...теперь мы называем серверы "облаком", не так ли?

Richard MacCutchan

Не очень много, но это всего лишь еще один пример провала системы безопасности так называемых "профессионалов" в этой отрасли.

Michael_Davies

Не уверен, что это было упомянуто, но вам нужны два параметра для AES_DECRYPT/ENCRYPT, текст и ключ, вы только передаете текст, поэтому ответ равен нулю.

Кроме того, вам нужно зашифровать, а не расшифровать данные, предоставленные пользователем для сравнения, или вы расшифруете поле для сравнения, см. ниже.

связь.Свойства commandtext = "выбрать команду uname,жидкости,urole от пользователей, где uid= '" &ампер; отделка(меня.txtUID.Текст) &ампер; "' и upwd= AES_ENcrypt(мне.txtPwd.Текст,&ЛТ;вам нужен ключ вот&ГТ;)"

Я уверен,что у вас будут люди, рассказывающие вам об атаках SQL-инъекций, поэтому они пройдут мимо этого...

2 Ответов

Рейтинг:
2

ZurdoDev

Комментарии все хороши, не делайте SQL-конкатенацию и не меняйте, как вы делаете пароли, если это возможно.

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

Видеть MySQL :: mysql 5.7 справочное руководство :: 12.13 функции шифрования и сжатия[^]


Рейтинг:
0

Patrice T

Не прямое решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]