让区块链回归
技术与应用的本质
(漫画: Hugh@链ke版权转载请联系小编)
趣味
实践
场景
男生Bob想向他的媳妇儿Alice表达埋藏已久的心声“I love you!”,但碍于男人的颜面,不好意思当面说出口,只好加密传输。这里基于一个可行的假设,就是他们已经拥有彼此的公钥,或者可以简单获得。
需求
加密:不能让别人看到信息;
解密:媳妇可以恢复并查看;
签名:Bob可以签名信息,确保不被篡改;
认证:媳妇收到信息,可以验明正身,确认是Bob所发,而不是别人的恶作剧。
方案
加密与解密技术:技术上,最好使用NaCl,其次是libsodium(背后仍是NaCl),但是搜索了一下github,Node.js社区还没有相关NaCl稳定的封装包,libsodium倒是有一个Natrium。因此,只能选择使用Crypto简单加密和解密。
签名与验证技术:当然最好的选择是了。
编码
新建一个简单的Node.js工程
(1)生成密钥对
Bob没有使用随机字符串,而是使用一个密码,并采取SHA256算法生成密钥对。
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验证并解密
通常是先验证后解密。
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/node.js-practice$ cd node.js-practice$ npm install$ node crypto/
输出结果:
签名合法,信息来自Bob!Bob said: Hi Alice, I love you!
链
ke
优质区块链社区
技术干货
框架原理
区块链+
价值应用
领取专属 10元无门槛券
私享最新 技术干货