我正在尝试在IIS中使用应用程序请求路由(ARR)将一组路径传递到Node.js网站。我的问题是能够在任何一方获得/设置身份验证票。
我真的需要一个加密/解密对的简单示例,它将适用于C#和Node.js,它们开箱即用,两者结果相同。在接下来的几天里,我会在时间允许的情况下自己解决这个问题,如果没有人在我面前提出答案,我打算回答。
我的目的是将节点侧写为Node.js端的connect / express模块。我已经在ASP.Net解决方案中进行了自定义身份验证,并且可以轻松地用两个平台上安全的东西替换我当前的方法(只要它们共享相同的密钥)。
在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);
}
在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;
}
Web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<membership>
<providers>
<!-- Remove default provider(s), so custom override works -->
<clear />
</providers>
</membership>
</system.web>
</configuration>
答案 0 :(得分:9)
这是使用DES算法的工作示例。 reference
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));
}
}
输出
iv: pdMBMjdeFdo=
encrypted as: 3uDkdT6aQ3c=
在node.js中使用正确的算法 des-ede-cbc :
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);
输出
3uDkdT6aQ3c= 3uDkdT6aQ3c=
12345 12345
答案 1 :(得分:0)
@xiaoyi答案是正确的。另外,我只是添加了一些清晰的详细代码。
在C#中使用DES算法加密
public static string EncryptTest(string toEncrypt, string key, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
byte[] initVectorBytes = Encoding.ASCII.GetBytes("$secure#");
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
tdes.IV = initVectorBytes;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
当EncryptTest("1234", "abcdefghijklmnop", false)
输出时:GD/JSd91ZnQ=
在nodejs中使用DES算法进行加密
var algorithm = 'des-ede-cbc';
function encryption(plainText) {
var key = new Buffer.from("abcdefghijklmnop", 'utf-8');
var iv = new Buffer.from("$secure#", "ascii");
var cipher = crypto.createCipheriv(algorithm, key, iv);
var encoded = cipher.update(plainText, 'ascii', 'base64');
encoded += cipher.final('base64');
console.log(encoded);
return encoded;
}
当encryption("1234")
输出时:GD/JSd91ZnQ=
节点:new Buffer('', '')
已过时。我将其替换为new Buffer.from()
在C#中使用DES算法解密
public static string DecryptTest(string cipherString, string key, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = Convert.FromBase64String(cipherString);
byte[] initVectorBytes = Encoding.ASCII.GetBytes("$secure#");
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
tdes.IV = initVectorBytes;
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
当DecryptTest("GD/JSd91ZnQ=", "abcdefghijklmnop", false)
输出时:1234
在nodejs中使用DES算法解密
var algorithm = 'des-ede-cbc';
function decryption(chipertext) {
var key = new Buffer.from("abcdefghijklmnop", 'utf-8');
var iv = new Buffer.from("$secure#", "ascii");
var encrypted = new Buffer.from(chipertext, 'base64');
var decipher = crypto.createDecipheriv(algorithm, key, iv);
var decoded = decipher.update(encrypted, 'binary', 'ascii');
decoded += decipher.final('ascii');
console.log(decoded);
return decoded;
}
当decryption("GD/JSd91ZnQ=")
输出时:1234
有关DES algorithm的更多详细信息