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

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

例如,

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

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

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

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

马丁

于 2010-03-12T16:47:53.117 回答
19

HMAC-SHA1 是一种单向哈希,而不是双向加密算法。你不能解密它。我没有时间在这里提供完整的加密代码 - 这是一个复杂的话题,但 Barry Dorrans 的“开始 ASP.NET 安全性”将为您提供一个很好的起点。(其中只有一些是 ASP.NET 特定的。)您还可以观看他关于该主题的DDD 演讲。

于 2010-03-12T16:34:29.807 回答
2

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

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

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

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

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

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

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

于 2011-01-15T16:03:20.390 回答