Как расшифровать строку, зашифрованную с помощью HMACSHA1? - PullRequest
8 голосов
/ 12 марта 2010

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

Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text

Public Class Form1

    Private Sub btnEncode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEncode.Click
        Dim hmacsha1 As New HMACSHA1(Encoding.ASCII.GetBytes(txtKey.Text))
        Dim hashValue As Byte() = hmacsha1.ComputeHash(Encoding.ASCII.GetBytes(txtValue.Text))
        txtResult.Text = BytesToHexString(hashValue)
        hmacsha1.Clear()
    End Sub

    Private Sub btnDecode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDecode.Click
        '???
    End Sub

    Private Function BytesToHexString(ByVal bytes As Byte()) As String
        Dim output As String = String.Empty
        Dim i As Integer = 0
        Do While i < bytes.Length
            output += bytes(i).ToString("X2")
            i += 1
        Loop
        Return output
    End Function
End Class

Ответы [ 3 ]

21 голосов
/ 12 марта 2010

Просто чтобы расширить ответ Джона, потому что вы, вероятно, задаетесь вопросом, в чем смысл шифрования чего-то, что вы не можете расшифровать - HMAC-SHA1, как сказал Джон, является хешем. Полученная строка не содержит исходной информации, даже в зашифрованном виде ... Это просто последовательность байтов.

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

Например,

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

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

Encyryption / Hashes - сложное дело, и я сам лишь немного поцарапал поверхность - но я подумал, что это может дать вам простой пример того, для чего используются хеши ...

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

Martin

17 голосов
/ 12 марта 2010

HMAC-SHA1 - это односторонний хэш , а не двунаправленный алгоритм шифрование . Вы не можете расшифровать это. У меня нет времени, чтобы предоставить полный код шифрования здесь - это сложная тема, но Барри Дорранс «Начало безопасности ASP.NET» даст вам хорошую отправную точку. (Только некоторые из них относятся к ASP.NET.) Вы также можете посмотреть его DDD доклад на эту тему.

2 голосов
/ 15 января 2011

Простое однонаправленное хеш-объяснение того, почему люди хотят это делать.

Допустим, у вас есть учетная запись с именем пользователя John и паролем Doe. Вы храните хэш следующей строки.

Имя, ваш любимый номер и выбранный им пароль

например: hash = myHash ("john7 @ password")

             now hash = "qk239qa*@$)(*84509053903" or whatever

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

- должен ли я использовать тот же ключ для повторного хеширования моих данных?

...