【问题标题】:How to decrypt a string encrypted with HMACSHA1?如何解密使用 HMACSHA1 加密的字符串?
【发布时间】:2011-01-26 21:49:53
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    然而,散列的美妙之处在于,您可能对字符串进行的任何类型的更改几乎肯定会导致散列结果发生变化,并且散列结果往往相当小。出于这个原因,散列经常被用来确保一条信息没有被篡改。

    例如,

    我想给 Jon 发送一条消息 - 我希望他确信他的一个伙伴在阅读之前没有更改消息。我不能只获取我的消息的哈希值并将其发送出去,因为麻烦制造者所要做的就是用他们自己的消息替换消息,并提供适当的哈希值......

    但是,如果我为我的消息提供的不是消息本身的哈希,而是约翰和我事先商定的带有几个特定额外字节的消息,那么麻烦制造者就会被击败。 Jon 知道在对我的消息进行哈希处理之前添加额外的字节(通常称为加盐哈希),但麻烦的原因不知道 - 所以如果他更改消息,即使他计算出自己的哈希,Jon 也可以看到一些东西不对劲……

    加密/哈希是一项繁琐的业务,我自己几乎没有触及表面 - 但我认为这可能会给你一个简单的例子来说明哈希的用途......

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

    马丁

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Sha-1 是一种单向哈希。 HMAC-SHA1 是消息认证码。这些显然不是一回事。更精确一点真的很有帮助。
      • 这是一个复杂的话题- 记录一下,这里有hmac_hash实现的代码和伪代码on wikipedia
      • Jon Skeet 回答你一个问题时的那种感觉...我们都羡慕你,亲爱的已经离开的朋友。
      【解决方案3】:

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

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

      名字、您最喜欢的号码以及他们选择的密码

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

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

      现在哈希是安全的,并且在大多数情况下无法反转以确定您最喜欢的数字是什么。要检查散列是否适合登录,您需要重新散列提供的输入(姓名、您的号码或 w/e、密码),如果您得到相同的精确散列,则它是有效的交易。 wo0t 是不是很简单!

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 2012-01-26
        • 1970-01-01
        • 2010-12-27
        • 2012-03-08
        相关资源
        最近更新 更多