Хранить хэш SHA256 в базе данных Access - PullRequest
1 голос
/ 04 февраля 2012

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

Это код для кнопки входа в систему:

Sub prcLogin()
        'Log User in

        Dim ds As New DataSet
        Dim blnCorrect As Boolean

        'Fill DataSet with login details
        prcConnectSet("SELECT * FROM Parent", "User", ds)

        strUser = txtUser.Text

        'Ensure username field is not blank
        If strUser <> "" Then

            'Search for the user
            For Each Row In ds.Tables("User").Rows
                Dim HashedPass As String = fncComputeHash(txtPass.Text & strUser)
                Dim ContainedPass As String = Row.Item(3)
                'Validate user
                If strUser = Row.Item(0) Then
                    If HashedPass = Row.Item(3) Then
                        blnCorrect = True
                        lblLoggedAs.Text = Row.Item(1)
                        Exit For
                    End If
                Else
                    blnCorrect = False
                End If
            Next
        End If

И это код для хеш-калькулятора:

    Function fncComputeHash(ByVal PasswordField As String) As String
        Dim Hasher As New SHA256CryptoServiceProvider()
        Dim encoder As New UTF8Encoding()

        Return Convert.ToBase64String(Hasher.ComputeHash(encoder.GetBytes(PasswordField)))

    End Function

Но когда я запускаю это вместо того, чтобы возвращать значение типа "rlzhYoiO4 + vpdJdsrFq5Sj9VBJ + FFYhIg9V5 + z + jeNI =", которое я сохранил в базе данных,он возвращает значение типа «5C6BED0D94B9BE8AFBC5C8CAC1E9D4BE03F556917C2611EC56F4E6F341EF60D9».Теперь, как мне обойти это?Я неправильно храню значения?Должен ли я хранить их как байтовый массив?Если да, то как мне это сделать?Или я получаю значения неправильно?Или все в порядке, и я должен преобразовать значение, как только получу его обратно из базы данных?

Я очень новичок во всей этой проблеме шифрования и даже аутентификации, так что если я делаю что-то глупое, скажите мне,

Заранее спасибо!

Редактировать: Я использую тип данных "Текст" в Access.

Редактировать 2: Извините, теперь я понимаю путаницу.Я храню только хэш!Не открытый пароль.Поэтому очень важно, чтобы хеш, полученный из базы данных, был в том же формате, что и идентификатор пользователя и пароль.

Редактировать 3: ОК Спасибо, ребята, я решил это.Мне нужно было преобразовать его в шестнадцатеричную строку, используя функцию SoapHexBinary.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2012

Когда вы имеете дело с сильным шифрованием, сильными хешами (такими как SHA1), очень важно понимать, что все они определены для работы со строками октетов, которые обычно являются массивами беззнаковых символов.Они не являются «строками», используемыми в популярных языках программирования.

То, что вы видите, «5C6BED ...» - это просто шестнадцатеричное кодирование октетов.Просто назовите эту строку и сохраните ее, а затем извлеките и преобразовайте обратно в необработанное значение для обработки.

0 голосов
/ 01 марта 2012

Я нашел то, что мне было нужно.Функция «SoapHexBinary» - это то, что мне нужно.Вот пример:

Function fncComputeHash(ByVal PasswordField As String) As String
    'Compute SHA-256 Hash value

    Dim Hasher As New SHA256CryptoServiceProvider()
    Dim encoder As New UTF8Encoding()
    Dim shb As New SoapHexBinary(Hasher.ComputeHash(encoder.GetBytes(PasswordField)))

    Return shb.ToString

End Function
0 голосов
/ 04 февраля 2012

Вы уверены, что это не намеченное поведение? Возвращает ли тот же хеш, если вы передаете то же значение? Если да, то вы достигли своей цели. У вас есть односторонняя хэшированная строка имени пользователя и пароля.

Сравнение таким образом, вы извлекаете has из базы данных и сохраняете хеш из таблицы

получить идентификатор пользователя и пароль из базы данных и вычислить хеш

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

databasehash=gethashfromdatabase(user_id)
receviedhash=computehash(user_id,password)

Теперь вы можете сравнить их.

примечание: если вы хотите получить более подробные объяснения о получении данных из базы данных или получении user_id из формы, я предлагаю опубликовать новый вопрос

...