2013年4月23日 星期二

Upload File

上傳一直是寫Web程式的開發人員不可或缺的一個口袋工具
Node.js針對上傳部分,比較普遍的是使用ExpressJS的上傳設定
而原生的http模組,也一樣可以做到上傳...
下面是網路上找到的兩筆不同上傳的範例:

2013年4月2日 星期二

NodeJS ssh sign and verify : ssh-signer


Ssh-signer(GitHub: https://github.com/peihsinsu/ssh-signer),開發的目的是希望提供一個使用crypto與http-signature的簽章與驗證工具...讓client端與server端可以直接安裝一個套件就可以做到簽章跟認證的動作...

安裝

npm install ssh-signer

使用

準備...載入相關modules並且準備opt參數(選用,不一定要放,沒放會使用預設 alg=RSA-SHA256, hash=base64)
var signer = require('ssh-signer')
  , fs = require('fs');

var opt = {
  alg:'RSA-SHA256',
  hash:'base64'
}
SSH key簽章 (opt選用)
//sign a key from public key path
var a = signer.signPrivateKey( 'Test123', '/root/.ssh/id_rsa', opt);

//sign a key from public key string
var privKeyStr = fs.readFileSync('/root/.ssh/id_rsa', 'UTF-8');
var a = signer.signPrivateKeyStr( 'Test123', privKeyStr, opt);
驗證 (opt選用)
//verify a key from public key path
var b = signer.verify(a, 'Test123', '/root/.ssh/id_rsa.pub', opt);

//verify a key from public key string
var pubKeyStr = fs.readFileSync('/root/.ssh/id_rsa.pub', 'UTF-8');
var b = signer.verifyStr(a, 'Test123', pubKeyStr, opt );
console.log('Verify result ==> ' + b); //will show true or false

SSH key sign & verify...

繼Node.js收錄crypto之後,還沒有機會實作相關功能
透過SSH key來做client與server間的認證會是各不錯的sample...

下面展示將ssh key的privare key跟public key做sign與verify的流程
屆時將private key放在client端,public key可以load在server端(目前MiCloud上管理ssh key的方式)
中間透過時間字串做key的hash減少傳輸中間key背破解的風險...

//STEP1: 載入crypto, http-signature兩各主要使用模組
var crypto=require("crypto");
var sys=require("sys");
var fs=require("fs");
var hs = require('http-signature');

//STEP2: 此處預計採用utf-8讀ssh key,另外,key是採用SHA256的加密方式
//產生key的指令:ssh-keygen -t rsa
var ENCODE= 'UTF-8';
var alg = "RSA-SHA256";
var n = new Date().toUTCString();
//讀取public key與private key
//public key
var pubKey = fs.readFileSync("/root/.ssh/id_rsa.pub", ENCODE);
//private key
var privKey = fs.readFileSync("/root/.ssh/id_rsa", ENCODE);

//STEP3: 使用base64 sign ssh private key
var signer = crypto.createSign(alg);
signer.update(n);
var secrit = signer.sign(privKey, 'base64');
console.log('SSH key singed...............................................');
console.log(secrit);

//以下部分可以用在server side
//STEP4: 透過http-signature來將public key轉換成pem格式
console.log('Compute SSH key to PEM.......................................');
var pem = hs.sshKeyToPEM(pubKey);
console.log(pem);

//STEP5: 轉換過的pem檔案,就可以透過crypto進行verify
console.log('Start to verify..............................................');
var ver = crypto.createVerify(alg);
ver.update(n);
var v = ver.verify(pem, secrit, 'base64');
console.log(v); //這邊會顯示verify的結果

以上,可以供有需要的人做參考~