2012-12-15 2 views
5

.Net에서 암호화 된 쿠키를 만들었으며 nodejs에서 해독하려고합니다. 그러나 예외 던지는 nodejs 유지 "형식 오류를 : 실패 DecipherFinal"나는 키암호 해독 .Net 쿠키 in nodejs

932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC.

내 web.config 파일로 AES 암호화 방법을 사용하고 닷넷에서

를 다음 행이

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

및 .NET 내 쿠키를 생성하는 코드는 다음과 같습니다

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)); 
,536,913,632 쿠키를 해독 (10)

nodejs 코드는 내가 가지 잃었어요

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

내가이 문제가 될 수 있는지에 대한 조언, 아이디어를 감사하겠습니다.

+0

'FormsAuthentication.Encrypt() '에서 어떤 종류의 암호화가 수행되는지 알려주는 리소스가 있습니까? Microsoft **는 ** 메소드의 실제 출력을 지정하지 않습니다. –

+0

.Net 4.5에 대해 최근에 이와 같은 문제가 발생했습니다. 누구든지 노드의 쿠키를 해독하는 과정을 진행 했습니까? – JasonB

+0

@ JasonB [매우 비슷한 질문] (http://stackoverflow.com/q/34882672/5128464) - 당신에게 흥미로울 수 있습니다. – vlp

답변

0

키가 문자열이 아닌, 방법 fromCharCode()에서 살펴 :

The fromCharCode() method converts Unicode values into characters.

createDecipheriv() 방법을 지정하는 동안 어떤 진수는, 텍스트 문자로 변환되는 것을 의미한다 :

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

이것은 현재있을 수있는 문제 중 하나 일 뿐이며 코드를 실행할 시간이 아직 없음을 유의하십시오.

0

문제는 자동 채우기에 실패했을 가능성이 있으며 기본적으로 사용하도록 설정되어 있습니다. 당신은 추가하여,이를 해제 할 :

c.setAutoPadding(false); 
1

당신은 Encryp의 소스 코드를보고 모든 다른 가능성 (Framework20SP1, Framework20SP2 등)

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

그것을 여기 해독 할 수 해당 코드를 읽는 데 몇 시간이 걸렸지 만, 일단 이해하면 특정 암호화 설정 만위한 간단한 코드를 작성할 수 있습니다.

+0

[이 부분] (https://github.com/Microsoft/referencesource/blob/4fe4349175f4c5091d972a7e56ea12012f1e7170/System.Web/Configuration/MachineKeySection.cs#L474)도 마찬가지로 적절합니다. – vlp