9

私は暗号化の初心者で、システム間で値をやり取りしようとしています。値を暗号化できますが、相手側で復号化する方法がわかりません。VB.NET を使用して単純な Windows フォーム アプリケーションを作成しました。値とキーを入力し、暗号化してから復号化して元の値を取得しようとしています。これまでの私のコードは次のとおりです。どんな助けでも大歓迎です。ありがとう。

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
4

3 に答える 3

21

ジョンの答えを拡張するだけです。おそらく、復号化できないものを暗号化することのポイントが何であるか疑問に思っているからです.Jonが言ったように、HMAC-SHA1はハッシュです. 生成された文字列には、暗号化された形式であっても、元の情報は含まれていません...これは単なる一連のバイトです。

ただし、ハッシュの優れた点は、文字列に何らかの変更を加えると、ほぼ確実にハッシュ結果が変化し、ハッシュ結果がかなり小さくなる傾向があることです。このため、ハッシュは、情報の一部が改ざんされていないことを確認するためによく使用されます。

例えば、

ここでジョンにメッセージを送りたいのですが、メッセージを読む前に、友人の 1 人がメッセージを変更していないことを確信してもらいたいのです。メッセージのハッシュを取得して送信することはできません。トラブルの原因者が行う必要があるのは、メッセージを自分のメッセージに置き換えて、適切なハッシュを提供することだけだからです...

ただし、メッセージ自体のハッシュではなく、ジョンと私が事前に合意したいくつかの特定の余分なバイトを含むメッセージのハッシュをメッセージに提供すると、トラブルメーカーは打ち負かされます. Jon は、私のメッセージをハッシュする前に余分なバイトを追加すること (一般に、ハッシュのソルトとして知られています) を知っていますが、トラブルの原因者はそうではありません。間違っている...

暗号化/ハッシュは厄介なビジネスであり、私自身は表面をかじっただけですが、これはハッシュが何に使用されるかの簡単な例を与えるかもしれないと思いました...

もう 1 つの非常に一般的な用途は、サイトのメンバーシップ情報を維持することです。ユーザーはパスワードを保存するのではなく、パスワードのハッシュを保存します。つまり、誰かがあなたのユーザー データにニックネームを付けたとしても、それを使用してシステムにログインすることはできません。

マーティン

于 2010-03-12T16:47:53.117 に答える
19

HMAC-SHA1 は双方向の暗号化アルゴリズムではなく、一方向のハッシュです。解読することはできません。ここで完全な暗号化コードを提供する時間はありません。これは複雑なトピックですが、Barry Dorrans の「Beginning ASP.NET Security」が良い出発点になります。(ASP.NET 固有のものは一部のみです。)このトピックに関する彼のDDD トークもご覧いただけます。

于 2010-03-12T16:34:29.807 に答える
2

なぜ人々がそれをしたいのかについての簡単な一方向ハッシュの説明.

ユーザー名が John でパスワードが Doe のユーザー アカウントがあるとします。次の文字列のハッシュを保存します。

名前、好きな番号、選択したパスワード

例: hash= myHash("john7@password")

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

これで、ハッシュは安全になり、ほとんどの場合、お気に入りの番号を割り出すために元に戻すことはできなくなりました。ハッシュがログインに適しているかどうかを確認するには、提供された入力 (名前、番号、または w/e、パスワード) を再ハッシュし、まったく同じハッシュを取得した場合、それは有効な取引です。それは完全に単純ではありません!

-- 同じキーを使用してデータを再ハッシュする必要がありますか?

于 2011-01-15T16:03:20.390 に答える