javascript
使用 JavaScriptService 在.NET Core 里实现DES加密算法
文章《ASP.NET Core loves JavaScript》和《跨平臺的 NodeJS 組件解決 .NetCore 不支持 System.Drawing圖形功能的若干問題》為我們擴展.NET Core的API提供了一套解決方案,上周在看.NET的加解密算法發現目前為止沒有包括DES算法,github上在才剛剛加入,具體可以看?https://group.cnblogs.com/topic/75273.html?。
Node.js的Crypto庫就提供各種加密算法,可以非常方便地讓我們使用密碼技術,解決應用開發中的問題。Crypto庫是隨Nodejs內核一起打包發布的,主要提供了加密、解密、簽名、驗證等功能。Crypto利用OpenSSL庫來實現它的加密技術,它提供OpenSSL中的一系列哈希方法,包括hmac、cipher、decipher、簽名和驗證等方法的封裝。Crypto官方文檔:http://nodejs.org/api/crypto.html, 博客文章http://blog.fens.me/nodejs-crypto/?寫的非常詳細。本文介紹如何使用Crypto的DES算法就可以幫助我們實現立即可用的DES算法。?
1、我們參照官方文檔?https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.NodeServices#microsoftaspnetcorenodeservices,我們創建一個.NET Core Console應用程序 DotNETNodeApp,添加Microsoft.AspNetCore.NodeServices 包引用:
Install-Package Microsoft.AspNetCore.NodeServices –Pre
2、配置環境,.NET Core默認都是采用的依賴注入模式,我們在這個JavaScriptService中間件也有需求使用到依賴注入,具體參考dudu的文章:在.NET Core控制臺程序中使用依賴注入
IServiceCollection services = new ServiceCollection();
//注入
services.AddNodeServices(options =>
{
??? options.ProjectPath = @"C:\Users\geffz\Documents\visual studio 2015\Projects\DotNETNodeApp\src\DotNETNodeApp";
??? options.WatchFileExtensions = new[] { ".js", ".sass" };
??? // ... etc. - see other properties below
});
//構建容器
IServiceProvider serviceProvider = services.BuildServiceProvider();
INodeServices nodeServices = serviceProvider.GetRequiredService<INodeServices>();
3、我們在項目創建一個Node文件夾,然后添加一個cryptUtil.js, 文件內容如下:
var crypto = require('crypto');
module.exports = {
??? encrypt: function (callback,plaintext, key,iv) {
??????? var ecb =? 'des-ecb';
??????? var enkey = new Buffer(key);
??????? var eniv = new Buffer(iv ? iv : 0);
??????? var cipher = crypto.createCipheriv(ecb, enkey, eniv);
??????? cipher.setAutoPadding(true)? //default true
??????? var ciph = cipher.update(plaintext, 'utf8', 'base64');
??????? ciph += cipher.final('base64');
??????? callback(null /* error */, ciph);
??? },
??? decrypt: function (callback, encrypt_text,key, iv) {
????? var ecb =? 'des-ecb';
????? var dekey = new Buffer(key);
??????? var deiv = new Buffer(iv ? iv : 0);
??????? var decipher = crypto.createDecipheriv(ecb, dekey, deiv);
??????? decipher.setAutoPadding(true);
??????? var txt = decipher.update(encrypt_text, 'base64', 'utf8');
??????? txt += decipher.final('utf8');
??????? callback(null, txt);
??? }
};
?
這里有有個JS函數,它將在.NET 程序中被調用,通過傳入一個 Node風格的回調函數和三個參數來計算結果。在NodeJS中,一個 JS 文件即代表一個模塊,module.exports的意思是把當前函數作為一個對象提供出去以供調用,我們這里有兩個函數分別代表加密/解密。
4、創建一個Des 類封裝NodeJs的函數調用:
using Microsoft.AspNetCore.NodeServices;
using System.Threading.Tasks;
?
namespace DotNETNodeApp
{
??? public class Des
??? {
??????? private INodeServices nodeServices;
?
??????? public Des(INodeServices nodeServices)
??????? {
??????????? this.nodeServices = nodeServices;
??????? }
?
??????? public async Task<string> EncryptDES(string data, string key, int iv)
??????? {
??????????? var result = await nodeServices.InvokeExportAsync<string>("./Node/cryptUtil", "encrypt", data, key, iv);
??????????? return result;
??????? }
?
??????? public async Task<string> DecryptDES(string data, string key, int vi)
??????? {
??????????? var result = await nodeServices.InvokeExportAsync<string>("./Node/cryptUtil", "decrypt", data,key , vi);
??????????? return result;
??????? }
??? }
}?
我們再看一下InvokeExportAsync<T>(``),他是一個異步的方法,通過傳入一個node.js腳本文件(模塊),三個形參來得到一個結果。
方法簽名:InvokeExportAsync<T>(string moduleName, string exportName, params object[] args)
5、我們在控制臺里測試下我們的封裝效果? ?
?Des desUtil = new Des(nodeServices);
??????????? string data = "geffzhang";
??????????? string key = "12345678";
??????????? string temp = desUtil.EncryptDES(data, key, 0).Result;
??????????? Console.WriteLine(temp);
??????????? string end = desUtil.DecryptDES(temp,key,0).Result;
??????????? Console.WriteLine(end);
??????????? Console.Read();
6、這樣使用的性能如何呢,我們用性能測試組件BenchmarkDotNet看下性能數據,使用方法參考?.NET Core性能測試組件BenchmarkDotNet 支持.NET Framework Mono:我們創建一個類DesBenchmark,在方法中加入Benchmark 特性
using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.NodeServices;
using System;
using Microsoft.Extensions.DependencyInjection;
using BenchmarkDotNet.Running;
namespace DotNETNodeApp
{
??? public class DesBenchmark
??? {
??????? private IServiceCollection services;
??????? private IServiceProvider serviceProvider;
??????? private INodeServices nodeServices;
?
??????? public DesBenchmark()
??????? {
??????????? IServiceCollection services = new ServiceCollection();
??????????? //注入
??????????? services.AddNodeServices(options =>
??????????? {
??????????????? options.ProjectPath = @"C:\Users\geffz\Documents\visual studio 2015\Projects\DotNETNodeApp\src\DotNETNodeApp";
??????????????? options.WatchFileExtensions = new[] { ".js", ".sass" };
??????????????? // ... etc. - see other properties below
??????????? });
??????????? //構建容器
??????????? serviceProvider = services.BuildServiceProvider();
??????????? nodeServices = serviceProvider.GetRequiredService<INodeServices>();
??????? }
?
??????? private string data = "geffzhang";?
??????? private string encryData = "uTRLyNkKTaFUxmJtHPlYoA==";
??????? private string key = "12345678";
?
??????? [Benchmark]
??????? public string EncryptDES()
??????? {
??????????? Des desUtil = new Des(nodeServices);
??????????? return desUtil.EncryptDES(data, key, 0).Result;
??????? }
?
??????? [Benchmark]
??????? public string DecryptDES()
??????? {
??????????? Des desUtil = new Des(nodeServices);
??????????? return desUtil.EncryptDES(encryData, key, 0).Result;
??????? }
??? }
}
下面是控制臺輸出的結果,性能還是不錯的
相關文章:?
ASP.NET Core loves JavaScript
跨平臺的 NodeJS 組件解決 .NetCore 不支持 System.Drawing圖形功能的若干問題
用BenchmarkDotNet給C#程序做性能測試
原文地址:http://www.cnblogs.com/shanyou/p/6014352.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
贊賞
人贊賞
總結
以上是生活随笔為你收集整理的使用 JavaScriptService 在.NET Core 里实现DES加密算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以ABP为基础架构的一个中等规模的OA开
- 下一篇: 微软Project Springfiel