2010-03-12 2 views
8

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

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 

ответ

16

HMAC-SHA1 является односторонним hash, не двунаправленная encryption алгоритм. Вы не можете расшифровать его. У меня нет времени, чтобы предоставить полный код шифрования здесь - это сложная тема, но Barry Dorrans '"Beginning ASP.NET Security" даст вам хорошую отправную точку. (Только некоторые из них специфичны для ASP.NET.) Вы также можете посмотреть его DDD talk по этой теме.

+0

Спасибо за информацию, Джон. – 2010-03-12 17:00:20

+2

Ша-1 - односторонний хеш. HMAC-SHA1 - это код аутентификации сообщения. Это явно не одно и то же. Это действительно помогло бы быть более точным. – Accipitridae

+0

* Это сложная тема * - Для записи есть код и псевдокод для реализации hmac_hash [по wikipedia] (http://en.wikipedia.org/wiki/Hash-based_message_authentication_code). – automaton

21

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

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

Например,

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

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

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

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

Martin

+0

Спасибо, Мартин. Некоторая полезная информация. – 2010-03-12 16:59:19

+0

Нет проблем с помощником ... –

2

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

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

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

, например: хэш = myHash («john7 @ пароль»)

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

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

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