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

9 .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
Run Code Online (Sandbox Code Playgroud)

Mar*_*lan 21

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

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

例如,

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

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

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

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

马丁


Jon*_*eet 18

HMAC-SHA1是单向散列,而不是双向加密算法.你不能解密它.我没有时间在这里提供完整的加密代码 - 这是一个复杂的主题,但Barry Dorrans的"开始ASP.NET安全"会给你一个很好的起点.(其中只有一部分是特定于ASP.NET的.)您还可以在该主题上观看他的DDD演讲.

  • Sha-1是单向散列.HMAC-SHA1是消息认证码.那些显然不是一回事.这会更准确一些. (2认同)