设为首页 收藏本站
查看: 878|回复: 0

[经验分享] 使用 JavaScriptService 在.NET Core 里实现DES加密算法

[复制链接]

尚未签到

发表于 2017-2-23 09:25:52 | 显示全部楼层 |阅读模式
  文章《ASP.NET Core love 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();
  运行一下就可以看到效果了:
DSC0000.png

  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;
        }
  }
}
  下面是控制台输出的结果,性能还是不错的
DSC0001.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345986-1-1.html 上篇帖子: 自己实现一个javascript事件模块 下篇帖子: 看看node.js chat程序如何实现Ajax long-polling长链接刷新模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表