Расшифруйте пароль в текстовое поле с помощью 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
Я здесь не для того, чтобы изменить мир, а только для того, чтобы отвечать на вопросы, которые мне задают. Может быть, есть причина, по которой пароли должны быть зашифрованы, о которой вы не знаете? Не нам решать, кто "достоин" ответа на свой вопрос, а кто нет.
Richard MacCutchan
https://www.codeproject.com/Messages/5408280/almost-million-US-citizens-have-been-accidentally.aspx.
F-ES Sitecore
Что делает кто-то, помещая незащищенную базу данных на общедоступный Интернет-сервер (извините...теперь мы называем серверы "облаком", не так ли?
Richard MacCutchan
Не очень много, но это всего лишь еще один пример провала системы безопасности так называемых "профессионалов" в этой отрасли.
Richard Deeming
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]
Richard Deeming
Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хеширование паролей - все правильно[^]
Michael_Davies
Не уверен, что это было упомянуто, но вам нужны два параметра для AES_DECRYPT/ENCRYPT, текст и ключ, вы только передаете текст, поэтому ответ равен нулю.
Кроме того, вам нужно зашифровать, а не расшифровать данные, предоставленные пользователем для сравнения, или вы расшифруете поле для сравнения, см. ниже.
связь.Свойства commandtext = "выбрать команду uname,жидкости,urole от пользователей, где uid= '" &ампер; отделка(меня.txtUID.Текст) &ампер; "' и upwd= AES_ENcrypt(мне.txtPwd.Текст,&ЛТ;вам нужен ключ вот&ГТ;)"
Я уверен,что у вас будут люди, рассказывающие вам об атаках SQL-инъекций, поэтому они пройдут мимо этого...