·起因

  汉字编码技术在实际应用中总是会存在这样或者那样的问题,尤其是在一些热门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的一些坑洞的更多相关文章

  1. 使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据

    一.  使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:“Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实 ...

  2. 如何综合运用对称加密技术、非对称加密技术(公钥密码体制)和Hash函数 保证信息的保密性、完整性、可用性和不可否认性?

    一.几个问题 在提出问题之前,先创建一个使用场景,发送方(甲方)要给接收方(乙方)发送投标书.大家知道,投标书都包括发送方的标的,这个标的是不能被竞标者知晓,更不能被竞标者修改的.在传输的投标书时,提 ...

  3. 安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS【下】

    1.  HTTPS 1.1. 什么是HTTPS HTTPS(HypertextTransfer Protocol Secure)即安全的HTTP.HTTPS的安全基础是安全套接层(Secure Soc ...

  4. 非对称加密技术中,iFace [ 爱妃链 ]人脸密钥技术排名第三,将弥补区块链现有不足

    最近,区块链领域,出现了一个比较热门技术的讨论,人脸密钥技术,可能大家还对这个名词感到很陌生,但是熟悉加密技术的技术大牛可能一听就能够明白大体的意思了,但是也正是这一熟悉而陌生的技术名词,掀起了区块链 ...

  5. 非对称加密技术里面,最近出现了一种奇葩的密钥生成技术,iFace人脸密钥技术

    要说到非对称加密技术啊,得先说说对称加密技术 什么是对称加密技术 对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密. 也就是密钥也可以用作解密密钥,这种方法在密码学中叫做对称 ...

  6. https处理的一个过程,对称加密和非对称加密

    一,对称加密 所谓对称加密,就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的过程如下: 发送端和接收端首先要共享相同的密钥k(即通信前双方都需要知道对应的密 ...

  7. AES和RSA混合加密技术在网络数据传输中的应用

    原文:http://www.fx361.com/page/2017/0110/519967.shtml          摘要:文章通过分析和比较AES加密算法和RsA加密算法的实现过程和各自的特点, ...

  8. 【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS

    一,对称加密 所谓对称加密.就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的步骤例如以下: 发送端和接收端首先要共享同样的密钥k(即通信前两方都须要知道相应 ...

  9. Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法

    对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...

随机推荐

  1. MapReduce源代码分析MapTask分析

    前言 MapReduce该分析是基于源代码Hadoop1.2.1代码分析进行的基础上. 该章节会分析在MapTask端的详细处理流程以及MapOutputCollector是怎样处理map之后的col ...

  2. 玩转Web之JavaScript(三)-----javaScript语法总结(三) 窗口/滚动条/文本的相关语法

    JS语法集锦(三) 窗口/滚动条/文本 alert("文本")    警告框:警告框经常用于确保用户可以得到某些信息,当警告框出现后,用户需要点击确定按钮才能继续进行操作. con ...

  3. 成不了天才,但为何也没成"人材"?(转)

    长期以来,"软件业"一直被视为"智力密集"型的"朝阳"产业,大多数从业者都受过高等教育,其平均素质居于社会各行业的前列,这个产业的顶尖人物被 ...

  4. iOS 要定义自己的导航栏button样式Button Image 执行出彩是不一样的与原来的颜色 -解

    在相机闪光灯,在导航栏中自己定义"闪"样式.点击变换的图像期望,但一直没有变化.原来是该条款的Global Tint颜色.因此,系统会自己主动改变图片的颜色Global Tint颜 ...

  5. python 性能- and-or 学习技能

    C语言类似表情: bool ? a : b ,当表达式值为真的话,值为a.否则为b. 看一个样例: >>> a = "first" >>> b ...

  6. 采用WindowManager添加您自己的自定义视图

    原文地址:使用WindowManager加入自己定义视图 在写手机卫士的时候,用户拨打|接听电话须要显示号码归属地,然后出现了一些异常.在此留下记号,希望对麻友们有帮助: BUG教程 在使用 view ...

  7. HTTP长连接和短连接(转)

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

  8. Android处理延迟加载的方法

    在项目开发,通过延时载入来实现满足我们的项目要求.那究竟如何来实现延时.以下结合java与android的相关方法来实现延时问题. 一.利用线程的Sleep方法 <span style=&quo ...

  9. [SignalR]Groups操作——后续

    原文:[SignalR]Groups操作——后续 继续http://www.cnblogs.com/YanZhiwei/p/3359175.html之前,那怎么实现发送的消息推送到隶属于这个组的用户呢 ...

  10. java注解(转)

    java中元注解有四个: @Retention @Target @Document @Inherited:  @Retention:注解的保留位置 @Retention(RetentionPolicy ...