用Iconv应对NodeJs对称加密技术在汉字编码与NoSQL的一些坑洞
·起因
汉字编码技术在实际应用中总是会存在这样或者那样的问题,尤其是在一些热门NoSQL方面多少会遇到挑战。比方说Cassandra字符集还不直接支持GB2312,要想存储写汉字那可真是麻烦。当然这还不算什么,原来以为的CRYPTO值得欣喜,当字符集遇上加解密时会更加痛苦,下面笔者会例举几个文本来对此进行说明。
·原理
关于对称加密技术:NodeJS算是比较亲民的,官网给了很多模块,唯独缺少经典的RSA,给了一个对称加密。但严格说来不是一项安全的加密技术,如果秘钥落在别人手里基本完蛋,所以还是RSA的公私钥组合是王道。但这不是本文的重点。
关于汉字入库或加密:编码三贱客,GB2312(GBK)/Unicode/UTF-8。剪不清理还乱,再碰上SecureCRT、.vimrc、profile基本上一团浆糊。在实际的应用中最头痛的问题就是想把汉字入到Cassandra/MongoDB中.先用一张图简示三贱客的关系。
最大的特点在于2字节与3字节的解读。对于大多数的系统和开源软件来说UTF-8是首选,即便像Node这样的好平台,也只有ASCII,UTF-8,BINARY可选,这就导致了在LINUX环境下我们无论是直接将中文入库还是加解密必然会出现各种乱码或"锟斤拷"。不过好在还有ICONV或者NATIVE2ASCII这样的好工具可以助我们一臂之力,可惜的是直接使用这些工具涉及到磁盘读写,还需要各位在真正处理流计算时要自己加工一下。下面结合使用编码处理和加解密来重新剖析这一过程。
·实验开始
SecureCRT的Apperance的char encoding选default;
.vimrc的中增加配置项set fileencodings=ucs-bom,utf-8,cp936;
.bash_profile增加配置项export LANG=zh_CN.gb2312;
--->编辑文件code.txt,输入"abc我"。用Iconv开始转换
iconv -f gb2312 -t utf-8 code.txt > code.txt.utf-8
iconv -f gb2312 -t unicode code.txt > code.txt.unicode
mv code.txt code.txt.gb2312
--->查看这3个文件,由于编码不同已经出现了乱码。

---> 加密这3个文件,得到如下结果。


1
//NodeJS ENCRPT
2
var filename = process.argv[2];
3
var codetype = process.argv[3];
4
5
/**
6
* * Created by Administrator on 14-1-31.
7
* */
8
9
10
/**
11
* * Created by Administrator on 14-1-31.
12
* */
13
14
var fs=require('fs');
15
var cc=new Array();
16
17
var aa='';
18
var s = fs.ReadStream(filename,{encoding:'utf-8'});
19
20 s.on('data', function(d) {
21 aa+=d;
22
});
23
24 s.on('end',function(){
25 cc=aa.split("\n");
26
//console.log(cc[0]);
27 pptxt=enp(cc[0]);
28
// dep(pptxt);
29
});
30
31
function enp(txt){
32
var crypto = require('crypto');
33
var fsf = require('fs');
34
35
var pem = fsf.readFileSync('server.pem');
36
var key = pem.toString('ascii');
37
var cipher = crypto.createCipher('aes-256-cbc',key);
38
var crymsg = cipher.update(txt,codetype,'hex');
39 crymsg += cipher.final('hex');
40
console.log(crymsg);
41
return crymsg;
42 }
aa041-cipher.js


1
//NodeJS DECRYPT
2
var filename = process.argv[2];
3
var codetype= process.argv[3];
4
5
/**
6
* * Created by Administrator on 14-1-31.
7
* */
8
9
10
/**
11
* * Created by Administrator on 14-1-31.
12
* */
13
14
var fs=require('fs');
15
var cc=new Array();
16
17
var aa='';
18
var s = fs.ReadStream(filename,{encoding:'utf-8'});
19
20 s.on('data', function(d) {
21 aa+=d;
22
});
23
24 s.on('end',function(){
25 cc=aa.split("\n");
26
//console.log(cc[0]);
27 pptxt=dep(cc[0]);
28
// dep(pptxt);
29
});
30
/*
31
function enp(txt){
32
var crypto = require('crypto');
33
var fsf = require('fs');
34
35
var pem = fsf.readFileSync('server.pem');
36
var key = pem.toString('ascii');
37
var cipher = crypto.createCipher('aes-256-cbc',key);
38
var crymsg = cipher.update(txt,'utf-8','hex');
39
crymsg += cipher.final('hex');
40
console.log(crymsg);
41
return crymsg;
42
}
43
*/
44
45
function dep(entxt){
46
var crypto = require('crypto');
47
var fsf = require('fs');
48
49
var pem = fsf.readFileSync('server.pem');
50
var key = pem.toString('ascii');
51
var decipher = crypto.createDecipher('aes-256-cbc',key);
52
var decrymsg=decipher.update(entxt,'hex',codetype);
53
54 decrymsg+=decipher.final(codetype);
55
console.log(decrymsg);
56
return decrymsg;
57 }
aa042-decpher.js
node aa041-cipher.js code.txt.gb2312 binary或者utf-8 > code.txt.gb2312.enp
node aa041-cipher.js code.txt.unicode binary或者utf-8 > code.txt.unicode.enp
node aa041-cipher.js code.txt.utf-8 binary或者utf-8 > code.txt.utf-8.enp

看似成功的加密,其实却暗藏杀机。如果对称解密都不可逆,那更不谈RSA了。所以我们重新开始解密看看,能否还原,凡是能还原的一定支持各类NoSQL,凡是不能还原的必然是万年坑洞。同时我们也想NodeJS不会热情到帮开发根据系统环境自动转换编码。
--->解密这3个文件,查看下结果。发现gb2312和unicode都吃了"锟斤拷"的憋(编码不符合规则,被自动填充,再强匹配GB2312的结果),唯独utf-8屹立不倒。
node aa042-depher.js code.txt.gb2312.enp binary或者utf-8 > code.txt.gb2312.enp.dep
node aa042-depher.js code.txt.unicode.enp binary或者utf-8 > code.txt.unicode.enp.dep
node aa042-depher.js code.txt.utf-8.enp binary或者utf-8 > code.txt.utf-8.enp.dep

·结论
更多的时候,我们在处理流体时,需要注意判断转换下,目前看来用iconv从gb2312转utf8算是一个比较屌丝的百试百灵的方法,网上也有很多的这样的模块。眼下的国内的IT环境大多还在向温饱和房子奋斗,等哪天像美帝那样有闲情逸致了,出几个NB的产品,把UTF-8统统换掉,哈哈哈。
用Iconv应对NodeJs对称加密技术在汉字编码与NoSQL的一些坑洞的更多相关文章
- 使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据
一. 使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:“Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实 ...
- 如何综合运用对称加密技术、非对称加密技术(公钥密码体制)和Hash函数 保证信息的保密性、完整性、可用性和不可否认性?
一.几个问题 在提出问题之前,先创建一个使用场景,发送方(甲方)要给接收方(乙方)发送投标书.大家知道,投标书都包括发送方的标的,这个标的是不能被竞标者知晓,更不能被竞标者修改的.在传输的投标书时,提 ...
- 安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS【下】
1. HTTPS 1.1. 什么是HTTPS HTTPS(HypertextTransfer Protocol Secure)即安全的HTTP.HTTPS的安全基础是安全套接层(Secure Soc ...
- 非对称加密技术中,iFace [ 爱妃链 ]人脸密钥技术排名第三,将弥补区块链现有不足
最近,区块链领域,出现了一个比较热门技术的讨论,人脸密钥技术,可能大家还对这个名词感到很陌生,但是熟悉加密技术的技术大牛可能一听就能够明白大体的意思了,但是也正是这一熟悉而陌生的技术名词,掀起了区块链 ...
- 非对称加密技术里面,最近出现了一种奇葩的密钥生成技术,iFace人脸密钥技术
要说到非对称加密技术啊,得先说说对称加密技术 什么是对称加密技术 对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密. 也就是密钥也可以用作解密密钥,这种方法在密码学中叫做对称 ...
- https处理的一个过程,对称加密和非对称加密
一,对称加密 所谓对称加密,就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的过程如下: 发送端和接收端首先要共享相同的密钥k(即通信前双方都需要知道对应的密 ...
- AES和RSA混合加密技术在网络数据传输中的应用
原文:http://www.fx361.com/page/2017/0110/519967.shtml 摘要:文章通过分析和比较AES加密算法和RsA加密算法的实现过程和各自的特点, ...
- 【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS
一,对称加密 所谓对称加密.就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的步骤例如以下: 发送端和接收端首先要共享同样的密钥k(即通信前两方都须要知道相应 ...
- Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法
对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...
随机推荐
- 【原创】构建高性能ASP.NET站点之三 细节决定成败
原文:[原创]构建高性能ASP.NET站点之三 细节决定成败 构建高性能ASP.NET站点之三 细节决定成败 前言:曾经就因为一个小小的疏忽,从而导致了服务器崩溃了,后来才发现:原来就是因为一个循环而 ...
- Cocos2d-x 3.x plist+png 做动画
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- MysqL的root用户不允许远程连接
原文:MysqL的root用户不允许远程连接 今天程序报了异常:java.sql.SQLException: Access denied for user 'root'@'RJB-Z' (using ...
- RH133读书笔记(11)-Lab 11 System Rescue and Troubleshooting
Lab 11 System Rescue and Troubleshooting Goal: To build skills in system rescue procedures. Estimate ...
- Qt on Android: Qt 5.3.0 公布,针对 Android 改进的说明
5月20日本,Qt 官方博客宣布 Qt 5.3.0 公布! 这个版本号聚焦在性能.稳定性和可用性的提升上,与 5.1 / 5.2 相比有非常大提升. 5.3.0 的主要变化: 稳定能.可用性大大提升 ...
- Gradle增量学习建筑
请在本系列下面的文章下载Github演示示例代码: git clone https://github.com/davenkin/gradle-learning.git 假设我们Gradle ...
- C++教程之lambda表达式一
什么是Lambda? C++ 11增加了一个很重要的特性--Lambda表达式.营里(戴维营)的兄弟都对Objective-C很熟悉,很多人多block情有独钟,将各种回调函数.代理通通都用它来实现. ...
- lua转让C++书面DLL达到“热更新”
原创作品,请注明出处转载CSDN:http://blog.csdn.net/relar/article/details/38084689 开发游戏server往往有"热更新"的需求 ...
- 怎样批量把excel中已显示的科学计数法取消
作者:iamlaosong 把一文本文档拷贝到EXCEL中时,当中一列数字所有变成科学计数法,这些数事实上是条码号,不需进行运算,怎样能够取消科学计算法,将数字显示成原来的样子呢?一般方法例如以下: ...
- 【核心研究】消息队列_MessageQueue
消息队列排队过程中的消息.这第一条消息将首先被处理.但假设消息本身指定要处理的时间.我们必须等待,直到时间的消息处理能力.新闻MessageQueue正在使用Message类的表示,队列中的邮件保存结 ...