OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

Node.JS用RSA签名算法公钥加密私钥解密,实现License软件授权验证


分享到


分类 JS学习   关键字 Node.JS   发布 ourjs  1558965941529
注意 转载须保留原文链接,译文链接,作者译者等信息。  
在Node.JS经常用加密算法对一些敏感用户数据进行加密,比如说用户密码。而且用户密码不需要考虑解密,如果用户遗失密度,重置成新的已经新密码即可。此时用不可逆加密算法即可,登录时对比加密后的字符串即可。

还有一些应用需要解密出原内容的,比如说HTTPS的传输。使用公钥对HTTP请求进行加密,在服务器用私钥解密。此时需要用到不对称加密算法,在Node.JS中这种机制很容易实现。

生成公钥和私钥


Node.JS中v10.12.0以上的版本,新添加 了 generateKeyPair方法可以用来创建公钥私钥:

crypto.generateKeyPair(type, options, callback)#

Added in: v10.12.0


因为我们要更改私钥,加入我们的版本信息,所以我们使用openssl生成私钥,命令行输入:

openssl genrsa -out private.pem 1024
输出如下:
Generating RSA private key, 1024 bit long modulus
........................++++++
................++++++
e is 65537 (0x10001)

私钥生成之后,您可以修改这个文件将部分内容换成您的版权声明,以备长期使用。私钥只在软件授权服务器上使用,普通用户无法获得。

用来加密LICENSE信息,如软件的购买方名称,版本,购买日期,用户数等信息,然后用这个修改后的私钥,生成公钥,分发给应用程序解密使用。

openssl rsa -in private.pem -pubout -out public.pem

输出:


$ openssl rsa -in private.pem -pubout -out public.pem
writing RSA key

由此可见,公钥是可以根据私钥推导生成出来的。因此要保证私租的安全。

用私钥创建签名


node.js 也封装了签名认证机制,然后可以用这个私钥进行签名验证:

var crypto  = require('crypto')
var fs      = require('fs')
var privateKey  = fs.readFileSync('private.pem').toString()
var publicKey   = fs.readFileSync('public.pem').toString()

var sign = crypto.createSign('SHA256');
sign.update('ourjs.com copy right');
var signature = sign.sign(privateKey, 'hex');
console.log(signature);

输出:

9d59c61117f121c26895dfe08a207e454560e5bef1c7837d6a7fdb92acc9f08f2b6d7e09eef49e7982ffa4e6110d510f6529b6ee49d0d576a8f09e62c4f9b80b7d41ec65290e7192c7e292d8a87f9a970afc01f95e86595ee9267726eeff3ea442e1d353f2a2c36bdf33d00ab9b292dda43fe7a086eaf8e853c4b9081a12330a

验证签名:

var verify = crypto.createVerify('SHA256');
verify.write('ourjs.com copy right');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));

输出:

true

代表签名内容相符。


私钥加密公钥解密


在客户端,如果仅需要私钥加密,公钥解密。比如软件授权方用公钥解密出软件授权信息,购买方名称,购买时间等。
这种情况Node.JS做了很好的封装,调用两个函数即可:

var signature = crypto.privateEncrypt(privateKey, Buffer.from('OurJS.com私钥加密公钥解密测试'))
var decrypted = crypto.publicDecrypt(publicKey, signature);
console.log(decrypted.toString())
> OurJS.com私钥加密公钥解密测试

公钥加密私钥解密

传统的RSA用公钥加密,私钥解密过程,使用publicEncrypt/ privateDecrypt 方法:

var encrypted = crypto.publicEncrypt(publicKey, Buffer.from('OurJS.com公钥加密私钥解密测试'))
var decrypted = crypto.privateDecrypt(privateKey, encrypted);
console.log(decrypted.toString())
OurJS.com私钥加密公钥解密测试

常见问题

如果你加密的内容过长,可能会遇到下面的异常: 

Error: error:0406C06E:rsa routines:RSA_padding_add_PKCS1_type_1:data too large for key size

1024默认只支持对117个字节的内容进行加密,可以修改密钥长度到足够大,比如4096即可:

openssl genrsa -out private.pem 4096



评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. Node.JS中用concat和push连接两个或多个数组的性能比较
  2. jQuery用$.prop,$.attr方法来获取或设置checkbox当前选中状态
  3. 判断是否为对象typeof abc == 'object' 与 instanceof 性能比较
  4. JavaScript中将字符串true或false转换成Boolean类型
  5. jQuery用outterHtml获取相对innerHTML父一级包含其自身的html代码内容
  6. 用网页table thead tfoot元素完美控制页眉页脚显示内容打印的简单方式
  7. 微服务运维难维护?数据基础架构公司Segment宣布放弃微服务构架
  8. Node.JS在命令行中检查Chrome浏览器是否安装,并打开指定网址
  9. Node.JS借助OS模块获取当前Windows系统用户登录名
  10. 用 OnceAir 搭建个人Git/Svn/照片备份服务器,每年电费7块钱

 相关阅读 - JS学习
  1. Node.JS借助OS模块获取当前Windows系统用户登录名
  2. JavaScript中将字符串true或false转换成Boolean类型
  3. jQuery用$.prop,$.attr方法来获取或设置checkbox当前选中状态
  4. Node.JS中用concat和push连接两个或多个数组的性能比较
  5. 判断是否为对象typeof abc == 'object' 与 instanceof 性能比较
  6. 配置TinyMCE网页文本编辑器不显示html head body等标签信息
  7. node.js中将console.log日志内容输出到文件
  8. typeof判断参数是否为undefined与全等判断法性能比较
  9. JavaScript不刷新查找当前网址上的querystring并修改查询字符串变量
  10. JavaScript如何快速高性能清空删除Array数组中的所有元素,并保持引用

 关键字 - Node.JS
  1. Node.JS的竞争对手?QuickJS入门教程,使用os模块读写文件,并将JavaScript编绎成可执行文件
  2. Node.JS借助OS模块获取当前Windows系统用户登录名
  3. Node.JS用RSA签名算法公钥加密私钥解密,实现License软件授权验证
  4. Node.JS在命令行中检查Chrome浏览器是否安装,并打开指定网址
  5. node.js中将console.log日志内容输出到文件
  6. 告别Node.js
  7. 提高NodeJS网站的安全性:Web服务器防黑客攻击技巧
  8. Node.JS用Socket实现FTP Server服务器和Client客户端
  9. [译]Node.js 框架比较: Express vs. Koa vs. Hapi
  10. Express入门教程:一个简单的博客

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号