Хранить хэш SHA256 в базе данных Access

Я пытаюсь понять, как хранить хэш в моей базе данных 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.


person Ben Elgar    schedule 04.02.2012    source источник
comment
какой тип данных вы используете для хранения хэша в БД?   -  person SoWhat    schedule 04.02.2012
comment
Извините за тег vb. Это был несчастный случай.   -  person Ben Elgar    schedule 04.02.2012
comment
вы не можете получить исходный пароль из хэша   -  person SoWhat    schedule 04.02.2012


Ответы (3)


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

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

person fishtoprecords    schedule 04.02.2012
comment
Спасибо за ваш ответ. Проблема в том, что у меня нет этой строки, прежде чем я добавлю ее в базу данных. Когда я сохраняю, это строка Base64, а когда я возвращаю ее, это шестнадцатеричная строка. Вы предлагаете мне преобразовать его в шестнадцатеричный формат перед сохранением? Если да, то как мне это сделать? - person Ben Elgar; 04.02.2012

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

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

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

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

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

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

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

person SoWhat    schedule 04.02.2012
comment
Спасибо за ваш ответ. Я понимаю, что одни и те же данные закодированы по-разному, однако как мне преобразовать одно в другое, чтобы я мог их сравнить? - person Ben Elgar; 04.02.2012
comment
Проблема в том, что я не храню пароль и идентификатор пользователя, а только хеш-значение. Извините за путаницу. - person Ben Elgar; 04.02.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
person Ben Elgar    schedule 01.03.2012