Dot-Net

如何解密使用 HMACSHA1 加密的字元串?

  • May 28, 2019

我是一個加密新手,試圖在系統之間來回傳遞一些值。我可以加密該值,但似乎無法弄清楚如何在另一端解密。我使用 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

HMAC-SHA1 是一種單向雜湊,而不是雙向加密算法。你不能解密它。我沒有時間在這裡提供完整的加密程式碼 - 這是一個複雜的話題,但 Barry Dorrans 的“開始 ASP.NET 安全性”將為您提供一個很好的起點。(其中只有一些是 ASP.NET 特定的。)您還可以觀看他關於該主題的DDD 演講。

只是為了擴展 Jon 的答案,因為您可能想知道加密您無法解密的東西有什麼意義 - 正如 Jon 所說,HMAC-SHA1 是一個雜湊。產生的字元串不包含原始資訊,即使是加密形式……它只是一個字節序列。

然而,散列的美妙之處在於,您可能對字元串進行的任何類型的更改幾乎肯定會導致散列結果的更改,並且散列結果往往相當小。出於這個原因,散列經常被用來確保一條資訊沒有被篡改。

例如,

我想給喬恩發一條資訊——我希望他確信他的一個夥伴在閱讀之前沒有改變資訊。我不能只獲取我的消息的雜湊值並將其發送出去,因為麻煩製造者所要做的就是用他們自己的消息替換消息,並提供適當的雜湊值……

但是,如果我為我的消息提供的不是消息本身的散列,而是帶有約翰和我事先同意的一些特定額外字節的消息,那麼麻煩製造者就被打敗了。Jon 知道在對我的消息進行雜湊處理之前添加額外的字節(通常稱為加鹽雜湊),但麻煩的原因不知道 - 所以如果他更改消息,即使他計算出自己的雜湊,Jon 也可以看到一些東西不對勁……

加密/雜湊是一項繁瑣的工作,我自己幾乎沒有觸及表面 - 但我認為這可能會給你一個簡單的例子來說明雜湊的用途……

另一個非常常見的用途是維護站點成員資訊——人們不儲存密碼,而是儲存密碼的雜湊值。這意味著即使有人設法竊取您的使用者數據,他們也無法使用它來登錄您的系統。

馬丁

引用自:https://stackoverflow.com/questions/2434154