·起因

  汉字编码技术在实际应用中总是会存在这样或者那样的问题,尤其是在一些热门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. 【007】【JVM——内存分配和恢复策略】

     内存分配与收回策略 JVM的自己主动内存管理要自己主动化地解决两个问题:对象分配内存以及回收分配给对象的内存.回收内存前几篇已经讲了.如今说内存分配.对象的内存分配一般分配在堆内存中,也可能经过 ...

  2. POJ 3356 AGTC(最长公共子)

    AGTC Description Let x and y be two strings over some finite alphabet A. We would like to transform  ...

  3. Android应用开发:LoaderManager在Activity/Fragment中的使用分析

    LoaderManager 外部接口initLoader:起始 public <D> Loader<D> initLoader(int id, Bundle args, Loa ...

  4. 买面包和IoC

    今天上午准备去一个阿姨,在那里买面包.这可能是由于小尺寸她的,因此,管理不规范,所以,当你买面包.没有人行.即使所有的大学生,似几乎没有这种意识.. . 但让我感到震惊的是.尽管没有排队,但阿姨似乎能 ...

  5. Cocos2d-iPhone V3 (1) 其基本程序常用的行动框架和介绍

    Cocos2d-iPhone V3 (1) 其基本程序常用的行动框架和介绍 博客:http://blog.csdn.net/prevention 笔者:犀利哥 - 第一部分:一个 Cocos2d-iP ...

  6. hdu4888 Redraw Beautiful Drawings

    14更多学校的第二个问题 网络流量   分别以行,列作为结点建图 i行表示的结点到j列表示的结点的流量便是(i, j)的值 跑遍最大流   若满流了便是有解   推断是否unique  就是在残余网络 ...

  7. 使用shell/python获取hostname/fqdn释疑(转)

    一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...

  8. What is Observer and Observable and when we used these?

    转会:http://stackoverflow.com/questions/13744450/interview-when-do-we-use-observer-and-observable

  9. gradle中使用cobertura做代码覆盖(转)

    gradle很好用,但是默认是没有代码覆盖功能的,只好自己写.曾经在网上找到过别人的一段脚本,虽然也能用,但是有一些不爽的地方,一个原因是它不支持对层级工程中全部代码的覆盖,另一个原因是它用替换bui ...

  10. Ajax请求访问action推断文件是否存在

    action措辞: public ActionForward fileIsExsit(ActionMapping mapping, ActionForm form, HttpServletReques ...