将DX中的authcode改成JS版,高难度的转换 JS的高手呀,过来看看吧,我是只会些PHP,懂一点点的JS皮毛。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 工程挺大的,自己修改的挺头大,你可以参考别人写的稍加修改一下http://hi.baidu.com/suidxfzggebjmqq/item/aaa6259751875bf229164794 主要是没有经过时间的沉淀,稳定不稳定还不知道呀。稳定性在加密与解密当中是相当重要的。其次才是加密强度,我是这样认为的。以前看别人弄的base64,结果有些无法解密。太扯蛋了。 @sibang :DX用到的加密解密算法当中用到了base64_decode、md5,这个你不用关心,我有现成的JS版,可以直接使用,你能把其它的代码转换成JS吗??? 只要base64没问题,别的都很简单啊 你写一个substr函数吧,然后我帮你把php转成jssubstr($key, 0, 16)这个函数用来从string类型的变量$key左侧抓取16位ord用来返回字符的 ASCII 码值这俩函数搞定了就没难点了. 开玩笑吧?js 的string 提供有substr 方法返回一个从指定位置开始的指定长度的子字符串。substring 方法返回位于 String 对象中指定位置的子字符串。 js中不晓得那些函数与PHP中的这些相对应range(0, 255)、chr、ord,所以弄了一下,不成功,才来这里求助的。我不经常写js,如果用也是jquery。目前出现的PHP问题我都能解决掉,但JS的话,必须要找高手了,毕竟我不擅长,而且我的发展方向为后端或者运维。版主也来了,那就写个完全的吧,也好测试,为web2.0做点贡献,毕竟很少的网站才会做前端加密的。PS:虽然我的小博客用了前端登录加密,但不通用,因此才想找一款适合前端加密的函数。希望版主能够理解。 PHP 对应 jschr String.fromCharCodeord String.charCodeAtrange(0, 255) new Array(256); 然后循环充填由于涉及字符集问题(js 始终使用unicode),直译后与php不对等,没有大大意义 弱弱的问下:直译后不对等,难道没有解决的办法?版主,如果文件编码用utf-8,PHP也用utf-8,这样呢???? 没有解决的办法?我想应该有,不过应该很麻烦你不是有 js 版的 base64 吗?你可用它对中文进行编解码测试一下 不弄了,好难呀。本来是想把DX论坛用的authcode弄成JS版,汗,感觉以我的水平不太现实。 我今天实现了一个node.js版本authcode 有人要吗 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')); 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 = Base64.decode(str); //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 = 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 += chr(ord(strbuf[i]) ^ (box[(box[a] + box[j]) % 256])); } if(operation == 'DECODE') { 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 { s = Base64.encode(s); var regex = new RegExp('=', "g"); s = s.replace(regex, ''); s = keyc+s; } return s;}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;}function chr(s){return String.fromCharCode(s);}function ord(s){return s.charCodeAt();}纯JS的,需要自己先加载 MD5.js 和 base64.js 分别实现 MD5 和 base64 这个方法 思路是对的 但是有一个小问题 就是 中文加密的问题 你的md5 对中文加密的话会和PHP 不一致 应该 改成 function md5(str){ var Buffer = require('buffer').Buffer var buf = new Buffer(1024); var len = buf.write(str, 0); str = buf.toString('binary', 0, len); var md5sum = require('crypto').createHash('md5'); md5sum.update(str); str = md5sum.digest('hex'); return str;} 数组中输入的html字符怎么打印的时候消失了? php如何调用active控件 求一个好用的网页音乐播放器 乱码问题 请教~~~ 请教大家:在URL的传入参数中存在#0,如何取 可以按下去弹上来的按钮 php 如何把彩色图片转换成黑白的? phpMyAdmin Fatal error: Maximum execution time of 30 seconds exceeded in php有哪些主流的框架请大家介绍些。 下面的xml怎么解析成php php simplexml_load_string在服务器上解析属性失败 来看代码了!
http://hi.baidu.com/suidxfzggebjmqq/item/aaa6259751875bf229164794
主要是没有经过时间的沉淀,稳定不稳定还不知道呀。稳定性在加密与解密当中是相当重要的。其次才是加密强度,我是这样认为的。以前看别人弄的base64,结果有些无法解密。太扯蛋了。
substr($key, 0, 16)这个函数用来从string类型的变量$key左侧抓取16位ord用来返回字符的 ASCII 码值这俩函数搞定了就没难点了.
substr 方法
返回一个从指定位置开始的指定长度的子字符串。substring 方法
返回位于 String 对象中指定位置的子字符串。
PS:虽然我的小博客用了前端登录加密,但不通用,因此才想找一款适合前端加密的函数。希望版主能够理解。
chr String.fromCharCode
ord String.charCodeAt
range(0, 255) new Array(256); 然后循环充填由于涉及字符集问题(js 始终使用unicode),直译后与php不对等,没有大大意义
我想应该有,不过应该很麻烦
你不是有 js 版的 base64 吗?你可用它对中文进行编解码测试一下
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'));
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 = Base64.decode(str);
//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 = 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 += chr(ord(strbuf[i]) ^ (box[(box[a] + box[j]) % 256]));
} if(operation == 'DECODE') {
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 {
s = Base64.encode(s);
var regex = new RegExp('=', "g");
s = s.replace(regex, '');
s = keyc+s;
} return s;
}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;
}
function chr(s){return String.fromCharCode(s);}
function ord(s){return s.charCodeAt();}纯JS的,需要自己先加载 MD5.js 和 base64.js 分别实现 MD5 和 base64
这个方法 思路是对的
但是有一个小问题 就是 中文加密的问题
你的md5 对中文加密的话会和PHP 不一致
应该 改成 function md5(str){
var Buffer = require('buffer').Buffer
var buf = new Buffer(1024);
var len = buf.write(str, 0);
str = buf.toString('binary', 0, len); var md5sum = require('crypto').createHash('md5');
md5sum.update(str);
str = md5sum.digest('hex');
return str;
}