Ejemplo común de código cifrado / descifrado para C # y Node.js / crypto

Estoy intentando usar el enrutamiento de solicitud de aplicaciones (ARR) en IIS para pasar un conjunto de rutas a un sitio web de Node.js. Mi problema es poder obtener / configurar el ticket de autenticación en cualquier lado.

Realmente necesito un ejemplo simple de un par de cifrado / descifrado que funcione para C # y Node.js cerca de la caja con los mismos resultados para ambos. Estaré trabajando en este problema por mí mismo cuando el tiempo lo permita en los próximos días, y trataré de responder si nadie tiene una respuesta antes que yo.

Mi intención es escribir el lado del nodo como un módulo de conexión / expreso en el lado Node.js. Ya estoy realizando una autenticación personalizada en la solución ASP.Net y puedo reemplazar fácilmente mi método actual con algo que puede ser seguro desde ambas plataformas (siempre que compartan la misma clave).


Código actual para crear la cookie de autenticación en AccountController.cs

 private void ProcessUserLogin(MyEntityModel db, SiteUser user, bool remember=false) { var roles = String.Join("|", value:user.SiteRoles.Select(sr => sr.Name.ToLowerInvariant().Trim()).Distinct().ToArray()); //update the laston record(s) user.UserAgent = Request.UserAgent; user.LastOn = DateTimeOffset.UtcNow; db.SaveChanges(); // Create and tuck away the cookie var authTicket = new FormsAuthenticationTicket( 1 ,user.Username ,DateTime.Now ,DateTime.Now.AddDays(31) //max 31 days ,remember ,string.IsNullOrWhiteSpace(roles) ? "guest" : roles ); var ticket = FormsAuthentication.Encrypt(authTicket); var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ticket); if (remember) cookie.Expires = DateTime.Now.AddDays(8); Response.Cookies.Add(cookie); } 

Código actual para leer la cookie de autenticación en Global.asax.cs

 void Application_AuthenticateRequest(object sender, EventArgs args) { HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie == null) return; FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); string[] roles = authTicket.UserData.Split(new Char[] { '|' }); //create new generic identity, and corresponding principal... var g = new GenericIdentity(authTicket.Name); var up = new GenericPrincipal(g, roles); //set principal for current request & thread (app will handle transitions from here) Thread.CurrentPrincipal = Context.User = up; } 

Parte relevante de la Web.config

            

Aquí hay un ejemplo de trabajo usando el algoritmo DES. referencia

 using System; using System.Text; using System.Security.Cryptography; public class Test { public static string Encrypt(string toEncrypt, string key, bool useHashing) { byte[] keyArray; byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); if (useHashing) { MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); } else keyArray = UTF8Encoding.UTF8.GetBytes(key); var tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; // tdes.Mode = CipherMode.CBC; // which is default // tdes.Padding = PaddingMode.PKCS7; // which is default Console.WriteLine("iv: {0}", Convert.ToBase64String(tdes.IV)); ICryptoTransform cTransform = tdes.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } public static void Main() { Console.WriteLine("encrypted as: {0}", Encrypt("12345", "abcdefghijklmnop", false)); } } 

que salidas

 iv: pdMBMjdeFdo= encrypted as: 3uDkdT6aQ3c= 

Y use el algoritmo correcto des-ede-cbc en node.js:

 var crypto = require('crypto'); var alg = 'des-ede-cbc'; var key = new Buffer('abcdefghijklmnop', 'utf-8'); var iv = new Buffer('pdMBMjdeFdo=', 'base64'); var encrypted = new Buffer('3uDkdT6aQ3c=', 'base64'); var source = '12345'; var cipher = crypto.createCipheriv(alg, key, iv); var encoded = cipher.update(source, 'ascii', 'base64'); encoded += cipher.final('base64'); console.log(encoded, encrypted.toString('base64')); var decipher = crypto.createDecipheriv(alg, key, iv); var decoded = decipher.update(encrypted, 'binary', 'ascii'); decoded += decipher.final('ascii'); console.log(decoded, source); 

que salidas

 3uDkdT6aQ3c= 3uDkdT6aQ3c= 12345 12345