2012-12-15 57 views
5

मैंने नेट में एक एन्क्रिप्टेड कुकी बनाई है और मैं नोडज में इसकी सामग्री को डिक्रिप्ट करने का प्रयास कर रहा हूं। लेकिन NodeJS रहता है अपवाद फेंक "लेखन त्रुटि: विफल DecipherFinal"डिक्रिप्ट। नोडीज में नेट कुकी

नेट में मैं कुंजी

932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC.

मेरे web.config फ़ाइल के साथ एईएस एन्क्रिप्शन विधि का उपयोग कर रहा निम्नलिखित पंक्ति है

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

और कोड है कि नेट में अपनी कुकी उत्पन्न करता है इस तरह दिखता है:

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

NodeJS कोड है कि कुकी decrypts

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

क्या आपके पास कोई संसाधन है जो आपको बताता है कि 'फॉर्म्स प्रमाणीकरण.एन्क्रिप्ट() 'के भीतर किस तरह का एन्क्रिप्शन किया जाता है? माइक्रोसॉफ्ट ** फिर ** विधि के वास्तविक आउटपुट निर्दिष्ट नहीं करता है। –

+0

मुझे हाल ही में एक ही समस्या हो रही है, नेट 4.5 के खिलाफ। क्या किसी ने नोड में कुकी को डिक्रिप्ट करने पर प्रगति की है? – JasonB

+0

@ जेसनबी मैंने उत्तर दिया [एक बहुत ही समान प्रश्न] (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