2013年4月2日 星期二

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的結果

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