如何解密用HMACSHA1加密的字符串?

时间:2010-03-12 16:31:51

标签: .net cryptography sha1 hmac cryptographic-hash-function

我是一个加密新手,试图在系统之间来回传递一些值。我可以加密该值,但似乎无法弄清楚如何在另一端解密。我使用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

3 个答案:

答案 0 :(得分:21)

只是为了扩展Jon的答案,因为你可能想知道加密你无法解密的东西是什么意思 - 正如Jon所说,HMAC-SHA1是一个哈希。生成的字符串不包含原始信息,即使是加密形式......它只是一个字节序列。

然而,散列的优点在于,您可能在字符串中进行的任何类型的更改几乎肯定会导致散列结果发生更改,并且散列结果往往相当小。出于这个原因,哈希通常用于确保一条信息没有被篡改。

例如,

我想在这里向Jon发送一条消息 - 我希望他确信他的一个伙伴在阅读之前没有改变过这个消息。我不能只接受我的消息的散列并发送它,因为所有麻烦都需要做的就是用自己的消息替换消息,并提供适当的散列...

但是,如果我提供的消息不是消息本身的散列,而是提供了John和我事先同意的具有一些特定额外字节的消息,那么麻烦制造者就会失败。 Jon知道在他散列我的消息之前添加额外的字节(通常称为salting哈希),但麻烦的是没有 - 所以如果他改变了消息,即使他计算出他自己的哈希,Jon也可以看到是不对......

Encyryption / Hashes是一个繁琐的事业,我自己几乎没有表面 - 但我想这可能会给你一个简单的例子,说明哈希用于什么......

另一个非常常见的用途是维护网站成员资格信息 - 人们不存储密码,而是存储密码的哈希值。这意味着即使有人设法篡改您的用户数据,他们也无法使用它来登录您的系统。

马丁

答案 1 :(得分:17)

HMAC-SHA1是单向hash,而不是双向encryption算法。你不能解密它。我没有时间在这里提供完整的加密代码 - 这是一个复杂的主题,但Barry Dorrans'"Beginning ASP.NET Security"会给你一个很好的起点。 (只有部分内容是特定于ASP.NET的。)您还可以在该主题上观看他的DDD talk

答案 2 :(得分:2)

一个简单的单向哈希解释,说明人们为什么要这样做。

假设您有一个用户名为John和密码Doe的用户帐户。您存储以下字符串的哈希值。

名字,您最喜欢的号码和他们选择的密码

例如:hash = myHash(“john7 @ password”)

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

现在哈希是安全的,无法反过来找出大多数情况下你最喜欢的数字。要检查哈希是否是正确的登录方式,您将重新哈希提供的输入(名称,您的号码或w / e,密码),如果您获得相同的确切哈希,则它是有效的交易。我不是很简单!

- 我应该使用相同的密钥来重新哈希我的数据吗?