用Iconv應對NodeJs對稱加密技術在漢字編碼與NoSQL的一些坑洞

·原由 node

  漢字編碼技術在實際應用中老是會存在這樣或者那樣的問題,尤爲是在一些熱門NoSQL方面多少會遇到挑戰。比方說Cassandra字符集還不直接支持GB2312,要想存儲寫漢字那可真是麻煩。固然這還不算什麼,原來覺得的CRYPTO值得欣喜,當字符集趕上加解密時會更加痛苦,下面筆者會例舉幾個文原本對此進行說明。 vim

·原理 安全

  關於對稱加密技術:NodeJS算是比較親民的,官網給了不少模塊,惟獨缺乏經典的RSA,給了一個對稱加密。但嚴格說來不是一項安全的加密技術,若是祕鑰落在別人手裏基本完蛋,因此仍是RSA的公私鑰組合是王道。但這不是本文的重點。 bash

    關於漢字入庫或加密:編碼三賤客,GB2312(GBK)/Unicode/UTF-8。剪不清理還亂,再碰上SecureCRT、.vimrc、profile基本上一團漿糊。在實際的應用中最頭痛的問題就是想把漢字入到Cassandra/MongoDB中.先用一張圖簡示三賤客的關係。           最大的特色在於2字節與3字節的解讀。對於大多數的系統和開源軟件來講UTF-8是首選,即使像Node這樣的好平臺,也只有ASCII,UTF-8,BINARY可選,這就致使了在LINUX環境下咱們不管是直接將中文入庫仍是加解密必然會出現各類亂碼或"錕斤拷"。不過好在還有ICONV或者NATIVE2ASCII這樣的好工具能夠助咱們一臂之力,惋惜的是直接使用這些工具涉及到磁盤讀寫,還須要各位在真正處理流計算時要本身加工一下。下面結合使用編碼處理和加解密來從新剖析這一過程。 工具

·實驗開始 ui

  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通通換掉,哈哈哈。
spa

相關文章
相關標籤/搜索