《Nodejs开发加密货币》之十:三张图让你全面掌握加密解密技术

关于

《Nodejs开发加密货币》,是一个加密货币产品的详细开发文档,涉及到使用Nodejs开发产品的方方面面,从前端到后台、从服务器到客户端、从PC到移动、加密解密等各个环节。代码完全开源、文章免费分享。 相关资源见 http://ebookchain.org

QQ交流群: 185046161

前言

加密解密技术,涉及面很广,这里,把前人的研究成果汇总起来,通过图表的形式来帮助记忆和筛选,方便日后使用。内容主要包括两个方面,一个是场景与算法,一个是Nodejs的相关模块或组件。共三张脑图,具体请看:

1.加密解密纵览

下面这张图,是在 《密码学一小时必知》(见参考)基础上完成的,原作者是Colin Percival,密码学方面的专家,FreeBSD项目的安全长官,Tarsnap在线备份服务的创始人,scrypt密钥衍生算法的作者,非常值得参考学习。译者是 @byronhe ,翻译贡献这样的好文,包括下面有关论述场景与算法的实践指南,值得去为他点赞。

这张图,可以告诉你密码学中的概念,目的,案例,以及最佳的实践经验。

2.场景与算法

这张图,是基于 《现代密码学实践指南(2015年)》(见参考) 完成的。可以说,在上一张图的基础上,更加具体,特别是对于场景的描述,让码农可以更加方便的作出正确的选择,值得拥有。其中,标注序号的,是有优先级的。

3.Nodejs中的的加密和解密、签名与认证

这张图,主要参考了官方文档及其他一些文档(见参考),按照我个人的理解画得。如果你使用Nodejs,基本上拿来看看图解,就能直接用了。特别是,默认选择了ed255519组件,如果你看了上面两篇实践,就知道这是签名与认证最好的选择,因此这里可以肯定的说,Crypto模块的签名与认证还是暂时不要用吧。Ebookcoin就是这么实践的,具体见下一篇介绍。另一个是Natrium组件,也可以用于签名和认证,但主要是用来非对称加密和解密的。这张脑图里的三个组合,按照上面的实践经验来说,应该是当前Nodejs加解密应用领域的最佳组合方案。

4.趣味实践

还是用在《在Nodejs中使用加密解密技术》里的的例子吧,设定角色,男生叫Bob,他的女友叫Alice。

场景

Bob想向女友表达埋藏已久的心声“I love you!”,但碍于男人的颜面(男人都这样吗?),不好意思当面说出口,只好加密传输。这里基于一个可行的假设,就是他们已经拥有彼此的公钥,或者可以简单获得。

需求

  • 加密:不能让别人看到信息;
  • 解密:女友可以恢复并查看;
  • 签名:Bob可以签名信息,确保不被篡改;
  • 认证:女友收到信息,可以验明正身,确认是Bob所发,而不是别人的恶作剧。

方案

利用以上三张图,我们可以很快拿出技术方案。

  • 加密与解密技术:第二张图显示说,这种加密之后又解密原文的场景非常少见。技术上,最好使用NaCl,其次是libsodium(背后仍然是NaCl),但是搜索了一下github,Nodejs社区还没有相关NaCl稳定的封装包,libsodium倒是有一个Natrium(但是,写作本文时,连安装都没有成功,有验证成功的,请告诉我一声)。因此,只能选择使用Crypto简单加密和解密。
  • 签名与验证技术:当然最好的选择是ed25519了。

编码

新建一个简单的Nodejs工程, 代码在这里: https://github.com/imfly/nodejs-practice/blob/master/crypto/index.js

(1)生成密钥对

Bob没有使用随机字符串,而是使用一个密码,并采取SHA256算法生成密钥对,请看思维导图,有关hash的部分。

var crypto = require(‘crypto‘);
var ed25519 = require(‘ed25519‘);

var bobsPassword = ‘This is my password, you don`t guess it!‘;
var hash = crypto.createHash(‘sha256‘).update(bobsPassword).digest();
var bobKeypair = ed25519.MakeKeypair(hash);

(2)给信息加密和签名

通常是先加密后签名。

这里使用Crypto给信息进行了简单加密,把Bob的公钥作为加密键值(但是既然是公钥,谁会不知道呢,除非Bob只把公钥给了Alice),可能还得Bob告诉Alice使用什么算法来解密。

var message = ‘Hi Alice, I love you!‘;
var msgCiphered = cipher(‘aes192‘, bobKeypair.publicKey, message); //公钥进行加密,如果是Natrium,这里就是私钥加密
var signature = ed25519.Sign(new Buffer(msgCiphered, ‘utf8‘), bobKeypair.privateKey); //私钥进行签名

(3)给Alice发送签名信息

这个就各显神通了。

(4)Alice验证并解密

通常是先验证后解密。

作为Bob的好朋友,Alice有他的公钥。

if (ed25519.Verify(new Buffer(msgCiphered, ‘utf8‘), signature, bobKeypair.publicKey)) {
    // 验证函数返回了true,通过验证
  var msg = decipher(‘aes192‘, bobKeypair.publicKey, msgCiphered);  //使用Bob的公钥解密

    console.log(‘签名合法,信息来自Bob!‘);
  console.log(‘Bob said: ‘, msg); //显示信息
} else {
    // 验证函数返回了false,肯定不是Bob的信息.
    console.log(‘签名不合法!‘);
}

(5)补充代码

上面用到的Crypto的加密解密方法:

//解密
function (algorithm, key, buffer){
    var encrypted = "";
    var cip = crypto.createCipher(algorithm, key);
    encrypted += cip.update(buffer, ‘utf8‘, ‘hex‘);
    encrypted += cip.final(‘hex‘);
    return encrypted;
}

//解密
function decipher(algorithm, key, encrypted){
    var decrypted = "";
    var decipher = crypto.createDecipher(algorithm, key);
    decrypted += decipher.update(encrypted, ‘hex‘, ‘utf8‘);
    decrypted += decipher.final(‘utf8‘);
    return decrypted;
}

(6)运行实例

使用下面的命令,可以运行上述代码:

$ git clone https://github.com/imfly/nodejs-practice
$ cd nodejs-practice
$ npm install
$ node crypto/

输出结果:

签名合法,信息来自Bob!
Bob said:  Hi Alice, I love you!

链接

本系列文章即时更新,若有兴趣,可通过Star收藏,^-^

本源文地址: https://github.com/imfly/bitcoin-on-nodejs

电子书阅读: http://bitcoin-on-nodejs.ebookchain.org

参考

Ed25519第三方组件

Ed25519官方网站

现代密码学实践指南(2015年)

密码学一小时必知

浅谈nodejs中的Crypto模块

时间: 2024-10-17 15:35:42

《Nodejs开发加密货币》之十:三张图让你全面掌握加密解密技术的相关文章

Android Adapter应该记住的三张图

关于ListView GridView 等等 需要AdapterView去绘图的控件,无论是面试别人还是别人面试我 ,总是会提到的.其实只要三张图就可以把它们搞的很清楚. 这里做一下备份! 所谓温故而知新, 那么就是下面要分析的Recycler.后续会补上

胖子哥的大数据之路(12)-三张图告诉你大数据安全方案设计

一.引言: 最近一直很忙,在做一个全国性项目的IT架构,所以一直没有更新,好在算是告一段落,继续努力吧.项目沟通中过程客户反复在强调,大数据的安全性,言下之意,用了大数据,就不安全了,就有漏洞了.所以花了些时间,针对大数据的安全设计做了一个总结,算是阶段性的成果吧,分享给大家. 二.安全架构 大数据安全架构主要从六个方面考虑,包括物理安全.系统安全.网络安全.应用安全.数据安全和管理安全六个维度.物理安全强调物理硬件的国产化,避免类似美国轰炸伊拉克悲剧的重演,这也算是一个国家战略的产物,虽未正式

三张图让你快速明白activity与fragment生命周期的异同点

第一张图:activity的生命周期 第二张图:fragment的生命周期 第三张图:activity与fragment生命周期对比 补充:如果你还是不明白,请翻译一下你不理解的对应单词. ---------------------------------------------------------------------------------------- 有什么问题,大家可以一起交流-- 更多精彩关于关注博主的微信订阅号:非常周末 微信搜索:非常周末 你可以扫描一下关注即可:

三张图教你生成一个Android jar 库。

我看到很多教人使用第三方开源组件的Android教程,都是在教基于源码工程的库导入,个人觉得非常不妥,认为最恰当的方式是把源码工程生成一个jar再导入到目标工程上使用,于是乎便有了下面三张图. 生成完毕后就会得到一个.jar文件,然后就可以直接到Android工程中使用了.

通过三张图了解Redux中的重要概念

上周利用业余的时间看了看Redux,刚开始有点不适应,一下在有了Action.Reducer.Store和Middleware这么多新的概念. 经过一些了解之后,发现Redux的单向数据里的模式还是比较容易理解的,结合着Redux的单向数据流模型,很多概念就比较清晰了. 下面就按照自己的理解整理出了Redux中相关的内容,如果你也刚开始学习Redux,希望能给你一个直观的认识. Action/Reducer/Store 首先,先看看第一张图,图中展示了Redux的单向数据流,以及Action.R

三张图让你高速明确activity与fragment生命周期的异同点

第一张图:activity的生命周期 第二张图:fragment的生命周期 第三张图:activity与fragment生命周期对照 补充:假设你还是不明确,请翻译一下你不理解的相应单词. ---------------------------------------------------------------------------------------- 有什么问题,大家能够一起交流-- 很多其它精彩关于关注博主的微信订阅号:很周末 微信搜索:很周末 你能够扫描一下关注就可以:

【转帖】自助式BI的崛起:三张图看清商业智能和大数据分析市场趋势

自助式BI的崛起:三张图看清商业智能和大数据分析市场趋势 大数据时代,商业智能和数据分析软件市场正在经历一场巨变,那些强调易用性的,人人都能使用的分析软件正在取代传统复杂的商业智能和分析软件成为市场的热点和趋势. 只要看一眼Tableau的财务报告,你就能明白商业智能市场正在发生什么,Tableau去年第四季度营收同比增长了75%.这标志着企业和个人纷纷开始购买那些“自助式”分析软件,也就是那种简单易用到完全不懂数据分析的业务人员和商务人士也能轻松上手的分析软件,例如Tableau,而传统商业分

NodeJs 开发微信公众号(三)微信事件交互

微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么样与微信交互的.这些功能的入口就是你在测试公众号里面填写的URL(以下用/login/wechat代替). 事件交互 扫码关注微信公众号后,微信会调用你的接口/login/wechat,并且附带一段xml信息,首先你需要获取一些签名,通过加密.排序比对是否与你填写的TOKEN一致,如果一致则进行xm

linux性能监控三张图

一.监控 二.测试 三.优化