2010-03-12 22 views
8

Tôi là người mới sử dụng mã hóa cố gắng chuyển một số giá trị qua lại giữa các hệ thống. Tôi có thể mã hóa giá trị, nhưng dường như không thể tìm ra cách giải mã ở đầu bên kia. Tôi đã tạo một ứng dụng Windows Forms đơn giản bằng cách sử dụng VB.NET. Đang cố gắng nhập giá trị và khóa, mã hóa rồi giải mã để nhận giá trị ban đầu. Đây là mã của tôi cho đến nay. Bất kỳ trợ giúp đánh giá rất nhiều. Cảm ơn.Làm thế nào để giải mã một chuỗi được mã hóa bằng HMACSHA1?

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 

Trả lời

16

HMAC-SHA1 là một chiều hash, không phải là một encryption thuật toán hai chiều. Bạn không thể giải mã nó. Tôi không có thời gian để cung cấp mã hóa đầy đủ ở đây - đó là một chủ đề phức tạp, nhưng Barry Dorrans '"Beginning ASP.NET Security" sẽ cung cấp cho bạn một điểm khởi đầu tốt. (Chỉ một số trong đó là ASP.NET cụ thể.) Bạn cũng có thể xem DDD talk của mình về chủ đề này.

+0

Cảm ơn thông tin, Jon. –

+2

Sha-1 là một băm một chiều. HMAC-SHA1 là mã xác thực thư. Đó rõ ràng là không giống nhau. Nó thực sự sẽ giúp chính xác hơn một chút. – Accipitridae

+0

* đó là một chủ đề phức tạp * - Đối với bản ghi, có mã và mã giả để triển khai hmac_hash [trên wikipedia] (http://en.wikipedia.org/wiki/Hash-based_message_authentication_code). – automaton

21

Chỉ cần mở rộng câu trả lời của Jon, bởi vì bạn có thể tự hỏi điểm nào là mã hóa thứ gì đó mà bạn không thể giải mã được - HMAC-SHA1 là, như Jon đã nói, một băm. Chuỗi được tạo ra không chứa thông tin ban đầu, ngay cả ở dạng mã hóa ... Nó chỉ là một chuỗi các byte.

Vẻ đẹp của băm tuy nhiên là bất kỳ loại thay đổi nào bạn có thể thực hiện trong chuỗi sẽ gần như chắc chắn dẫn đến thay đổi kết quả băm và kết quả băm có xu hướng khá nhỏ. Vì lý do này, băm thường được sử dụng để đảm bảo rằng một phần thông tin đã không bị giả mạo.

Ví dụ,

Tôi muốn gửi Jon đây nhắn - và tôi muốn cậu ấy thể tự tin rằng một trong những bạn tình của mình đã không thay đổi được thông báo trước khi ông đọc nó. Tôi không thể lấy băm của thông điệp của tôi và gửi đi cùng, bởi vì tất cả những người gây rắc rối sẽ phải thay thế tin nhắn bằng một cái riêng của họ, và cung cấp một băm phù hợp ...

Tuy nhiên, nếu Tôi cung cấp tin nhắn của tôi với một băm không phải của bản thân thông điệp, nhưng thay vì thông điệp với một vài byte bổ sung cụ thể mà John và tôi đã đồng ý trước, người gây rắc rối bị đánh bại. Jon biết thêm các byte thừa (thường được gọi là salting hash) trước khi anh ta băm thông điệp của tôi, nhưng người gây rắc rối thì không - vì vậy nếu anh ta thay đổi tin nhắn, mặc dù anh ấy làm ra băm của riêng mình, Jon có thể thấy điều gì đó vẫn còn thiếu thiếu ...

Encyryption/băm là một doanh nghiệp khó sử dụng, và tôi đã hầu như không trầy xước bề mặt bản thân mình - nhưng tôi nghĩ rằng điều này có thể cung cấp cho bạn một ví dụ đơn giản về những gì băm được sử dụng cho ...

Một cách sử dụng rất phổ biến khác là duy trì thông tin thành viên trang web - mọi người không lưu trữ mật khẩu, mà đúng hơn là mã băm của mật khẩu. Điều này có nghĩa là ngay cả khi ai đó quản lý dữ liệu người dùng của bạn, họ không thể sử dụng nó để đăng nhập vào hệ thống của bạn.

Martin

+0

Cảm ơn, Martin. Một số thông tin hữu ích. –

+0

Không có vấn đề giao phối ... –

2

Giải thích băm một chiều đơn giản là lý do mọi người muốn thực hiện.

Cho phép nói rằng bạn có tài khoản người dùng có tên người dùng là John và mật khẩu Doe. Bạn lưu trữ băm của chuỗi sau.

First name, số ưa thích của bạn, và mật khẩu được lựa chọn của họ

ví dụ: hash = myHash ("john7 @ password")

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

Bây giờ băm đó là an toàn và không thể bị đảo ngược trở lại tìm ra số yêu thích của bạn trong hầu hết các trường hợp. Để kiểm tra xem băm có phải là một trong những quyền cho đăng nhập, bạn sẽ băm lại đầu vào được cung cấp (tên, số của bạn hoặc w/e, mật khẩu) và nếu bạn nhận được cùng một băm chính xác, đó là một giao dịch hợp lệ. wo0t isnt nó hoàn toàn đơn giản!

- Tôi có nên sử dụng cùng một khóa để băm lại dữ liệu của mình không?