2012-12-15 11 views
5

Utworzyłem zaszyfrowany plik cookie w .Net i próbuję odszyfrować jego zawartość w nodejs. Ale nodejs zachowuje rzuca wyjątek "TypeError: DecipherFinal fail"Odszyfruj plik .Net cookie w nodejs

w .NET Używam metody szyfrowania AES z kluczem

932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC.

moim pliku web.config ma następujący wiersz

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

I kod, który generuje mój cookie w .NET wygląda następująco:

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)); 

Kod nodejs który odszyfrowuje plik cookie jest

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; 
} 

Jestem trochę zagubiony i byłbym wdzięczny wskazówek i pomysłów na temat tego, co może być problemem.

+0

Czy masz zasób, który mówi, jaki rodzaj szyfrowania jest wykonywany w ramach 'FormsAuthentication.Encrypt()'? Microsoft ** ponownie ** nie określa faktycznego wyniku tej metody. –

+0

Mam ostatnio ten sam problem, przeciwko .Net 4.5. Czy ktokolwiek poczynił postępy w odszyfrowywaniu pliku cookie w węźle? – JasonB

+0

@JasonB Odpowiedziałem [bardzo podobne pytanie] (http://stackoverflow.com/q/34882672/5128464) - może być interesujące dla ciebie. – vlp

Odpowiedz

0

Klucz nie jest ciągiem znaków, przyjrzeć się metodzie fromCharCode():

The fromCharCode() method converts Unicode values into characters.

Oznacza to, że szesnastkowy jest konwertowany do postaci tekstowej, natomiast createDecipheriv() metoda określa, że:

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

Zauważ, że jest to tylko jeden z problemów, które mogą wystąpić, nie miałem czasu na uruchomienie kodu (jeszcze).

0

Twoim problemem jest prawdopodobnie niepowodzenie automatycznego dopełniania, domyślnie włączone. Aby to wyłączyć, dodając:

c.setAutoPadding(false); 
1

Można zobaczyć kod źródłowy Encryp i deszyfrowania tutaj ze wszystkimi różnymi możliwościami (Framework20SP1, Framework20SP2 itp)

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

It zabrało mi godziny na przeczytanie tego kodu, ale gdy już go otrzymasz, możesz napisać prosty kod tylko dla określonych ustawień szyfrowania.

+0

[Ta część] (https://github.com/Microsoft/referencesource/blob/4fe4349175f4c5091d972a7e56ea12012f1e7170/System.Web/Configuration/MachineKeySection.cs#L474) jest również bardzo trafna. – vlp