·起因

  汉字编码技术在实际应用中总是会存在这样或者那样的问题,尤其是在一些热门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. poj1276--Cash Machine(多背包被判刑了)

    Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27804   Accepted: 9915 Des ...

  2. index_ss hint 使用的运行计划变化对照

    index_ss  hint 使用的运行计划变化对照 当中 buffer 代表:当前操作中发生的内存读次数,包括一致性读和当前读 尽管 emp 表记录数不多,可是buffer 读内存的次数区别还是有点 ...

  3. POJ 3691 DNA repair 基于AC自己主动机DP

    dp[i][j] 它表示的长度 i 下游前缀 j 更改节点的最小数量. 很清楚dp[0][0] = 0; dp[ i ][ j ] = min(dp[ i ][ j ],dp[i-1][k] + (j ...

  4. RH133读书笔记(7)-Lab 7 Advanced Filesystem Mangement

    Lab 7 Advanced Filesystem Mangement Goal: Develop skills and knowlege related to Software RAID, LVM, ...

  5. Android:ViewPager扩展的具体解释——导航ViewPagerIndicator(有图片缓存,异步加载图片)

    我们已经用viewpager该. github那里viewpager扩展,导航风格更丰富.这个开源项目ViewPagerIndicator.非常好用,但样品是比较简单,实际用起来是非常不延长.例如,在 ...

  6. state-of-the-art implementations related to visual recognition and search

    http://rogerioferis.com/VisualRecognitionAndSearch2014/Resources.html Source Code Non-exhaustive lis ...

  7. 国外流行的共享网站实现:facebook,twitter,google+1,tumblr等待

    近期需要做相关的国外几个站点共享,本来我以为它会和weibo.在同样的烦恼空间,什么appkey啦,apptoken啦.api啦.结果非常意外的发现并非如此恼火. Twitter分享: https:/ ...

  8. SDUT OJ 2463 学校password你必须学会科学计划

    #include<iostream> #include<string.h> #include<stdio.h> #define N 10010 #define M ...

  9. Android:创建耐磨应用 - 定义自己的布局

    创建自己的自定义布局(Creating Custom Layouts) 本文介绍如何创建自己的自定义通知和使用可穿戴UI库来创建自己的自定义布局同时你还需要知道耐磨设计标准(Wear Design P ...

  10. android开源应用(主要是博客上带有分析的)收集 【持续更新】

    2014.5.24更新: (android高仿系列)今日头条    http://blog.csdn.net/vipzjyno1/article/details/26514543 CSDN Andro ...