ucenter authcode加解密算法javascript版
ucenter auth加解算法for ruby.authcode.rb
准备在用户输入密码的时候,将密码进行混淆,防止抓包看到明文的密码,保护用户那点点隐私。为了和后台进行比较好的交互,使用了php版本的authcode进行数据转换。
在提交表单的时候,用密钥A进行数据加密,在后台用密钥A获取数据,再使用密钥B进行登陆判断。
登陆过程中,密钥尽量使用验证码或者时间戳。
以下代码在nodejs中测试通过。
[js]
function authcode(str, operation, key, expiry) {
var operation = operation ? operation : ‘DECODE’;
var key = key ? key : ”;
var expiry = expiry ? expiry : 0;
var ckey_length = 4;
key = md5(key);
// 密匙a会参与加解密
var keya = md5(key.substr(0, 16));
// 密匙b会用来做数据完整性验证
var keyb = md5(key.substr(16, 16));
// 密匙c用于变化生成的密文
var keyc = ckey_length ? (operation == ‘DECODE’ ? str.substr(0, ckey_length): md5(microtime()).substr(-ckey_length)) : ”;
// 参与运算的密匙
var cryptkey = keya+md5(keya+keyc);
var strbuf;
if(operation == ‘DECODE’) {
str = str.substr(ckey_length);
strbuf = new Buffer(str,’base64′);
//string = b.toString();
}
else {
expiry = expiry ? expiry + time() : 0;
tmpstr = expiry.toString();
if(tmpstr.length>=10)
str = tmpstr.substr(0,10)+md5(str+keyb).substr(0, 16)+str;
else {
var count = 10 – tmpstr.length;
for(var i=0;i<count;i++) {
tmpstr = ‘0’+tmpstr;
}
str = tmpstr+md5(str+keyb).substr(0, 16)+str;
}
strbuf = new Buffer(str);
}
var box = new Array(256);
for(var i=0; i < 256; i++) {
box[i] = i;
}
var rndkey = new Array();
// 产生密匙簿
for(var i=0; i < 256; i++) {
rndkey[i] = cryptkey.charCodeAt(i % cryptkey.length);
}
// 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
for(var j = i = 0; i < 256; i++) {
j = (j + box[i] + rndkey[i]) % 256;
tmp = box[i];
box[i] = box[j];
box[j] = tmp;
}
// 核心加解密部分
var s = ”;
for(var a = j = i = 0; i < strbuf.length; i++) {
a = (a + 1) % 256;
j = (j + box[a]) % 256;
tmp = box[a];
box[a] = box[j];
box[j] = tmp;
// 从密匙簿得出密匙进行异或,再转成字符
//s += String.fromCharCode(string[i] ^ (box[(box[a] + box[j]) % 256]));
strbuf[i] = strbuf[i] ^ (box[(box[a] + box[j]) % 256])
}
if(operation == ‘DECODE’) {
var s = strbuf.toString();
if((s.substr(0, 10) == 0 || s.substr( 0, 10) – time() > 0) && s.substr(10, 16) == md5(s.substr(26)+keyb).substr(0, 16)) {
s = s.substr(26);
} else {
s = ”;
}
}
else {
var s = strbuf.toString(‘base64’);
var regex = new RegExp(‘=’, "g");
s = s.replace(regex, ”);
s = keyc+s;
}
return s;
}
function md5(str){
var hash = require(‘crypto’).createHash(‘md5’);
return hash.update(str+"").digest(‘hex’);
}
function time() {
var unixtime_ms = new Date().getTime();
return parseInt(unixtime_ms / 1000);
}
function microtime(get_as_float) {
var unixtime_ms = new Date().getTime();
var sec = parseInt(unixtime_ms / 1000);
return get_as_float ? (unixtime_ms/1000) : (unixtime_ms – (sec * 1000))/1000 + ‘ ‘ + sec;
}
//console.log(authcode(‘4961CxOTjLPyesRm0Qips70cCaFJzgCZg4F4GGMiDVQ’,’DECODE’,’key’));
//console.log(authcode(‘abc’,’ENCODE’,’key’));
[/js]
实用才是根本,赞一个
癸巳年(蛇)六月廿四 2013-7-31