2012-12-15 38 views
5

Tôi đã tạo một cookie được mã hóa trong .Net và tôi đang cố gắng giải mã nội dung của nó trong các nút. Nhưng nodejs giữ ném ngoại lệ "Lỗi Loại: DecipherFinal thất bại"Giải mã .Net cookie trong nodejs

Trong Net Tôi đang sử dụng phương pháp mã hóa AES với khóa

932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC.

file web.config của tôi có hàng sau

<machineKey validationKey="A5326FFC9D3B74527AECE124D0B7BE5D85D58AFB12AAB3D76319B27EE57608A5A7BCAB5E34C7F1305ECE5AC78DB1FFEC0A9435C316884AB4C83D2008B533CFD9" 
decryptionKey="932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC" 
validation="SHA1" decryption="AES" /> 

Và mã mà tạo ra cookie của tôi trong Net trông như thế này:

var ticket = new FormsAuthenticationTicket(0, "test", DateTime.Now, DateTime.Now.AddYears(1), true, "test"); 
var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
Response.Cookies.Add(new HttpCookie(cookieName, encryptedTicket)); 

Mã nodejs để giải mã các tập tin cookie là

var crypto = require('crypto'); 
var logger = require('winston'); 
var deckey = "932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC"; 

function hex2a(hex) { 
    var str = ''; 
    for (var i = 0; i < hex.length; i += 2) 
    str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); 
    return str; 
} 

function decrypt(cookie) {   
    var ivc = cookie, iv, cipherText, ivSize = 16, res; 

    ivc = new Buffer(ivc, 'hex'); 
    iv = new Buffer(ivSize); 

    cipherText = new Buffer(ivc.length - ivSize); 
    ivc.copy(iv, 0, 0, ivSize); 
    ivc.copy(cipherText, 0, ivSize); 

    iv = new Buffer(Array(16)); 
    c = crypto.createDecipheriv('aes-256-cbc', hex2a(deckey), iv.toString()); 
    res = c.update(cipherText, 'binary'); 
    res += c.final('binary'); //<-- throws TypeError: DecipherFinal fail 
    return res; 
} 

tôi là loại bị mất và tôi sẽ đánh giá cao lời khuyên hay ý tưởng về những gì có thể vấn đề này.

+0

Bạn có tài nguyên cho bạn biết loại mã hóa nào được thực hiện trong 'FormsAuthentication.Encrypt()'? Microsoft ** một lần nữa ** không xác định đầu ra thực tế của phương thức. –

+0

Tôi đã gặp vấn đề tương tự gần đây, chống lại .Net 4.5. Có ai đã thực hiện tiến trình giải mã cookie trong nút không? – JasonB

+0

@JasonB Tôi đã trả lời [một câu hỏi rất giống] (http://stackoverflow.com/q/34882672/5128464) - có thể thú vị cho bạn. – vlp

Trả lời

0

Một chìa khóa không phải là một String, hãy nhìn vào các phương pháp fromCharCode():

The fromCharCode() method converts Unicode values into characters.

Điều này có nghĩa rằng bất kỳ hệ thập lục phân được chuyển thành một nhân vật văn bản, trong khi createDecipheriv() phương pháp xác định rằng:

key and iv must be 'binary' encoded strings or buffers.

Lưu ý rằng đây chỉ là một trong những vấn đề có thể có mặt, tôi chưa có thời gian để chạy mã (chưa).

0

Sự cố của bạn có thể là lỗi trong đệm tự động, được bật theo mặc định. Bạn muốn tắt chức năng này, bằng cách thêm:

c.setAutoPadding(false); 
1

Bạn có thể xem mã nguồn của Encryp và giải mã ở đây với tất cả các khả năng khác nhau (Framework20SP1, Framework20SP2, vv)

https://github.com/Microsoft/referencesource/blob/master/System.Web/Security/FormsAuthentication.cs

Nó đã cho tôi giờ để đọc mã đó, nhưng một khi bạn đã nhận được nó, nó có thể viết một mã đơn giản chỉ dành cho các thiết lập mã hóa cụ thể của bạn.

+0

[Phần này] (https://github.com/Microsoft/referencesource/blob/4fe4349175f4c5091d972a7e56ea12012f1e7170/System.Web/Configuration/MachineKeySection.cs#L474) cũng khá phù hợp. – vlp

Các vấn đề liên quan