Javascript SHA-1:Secure Hash Algorithm

2016-02-19 11:50 14 1 收藏

图老师小编精心整理的Javascript SHA-1:Secure Hash Algorithm希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - Web开发 】

From:http://pajhome.org.uk/crypt/md5/sha1src.html
/* * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined * in FIPS PUB 180-1 * Version 2.1a Copyright Paul Johnston 2000 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for details. *//* * Configurable variables. You may need to tweak these to be compatible with * the server-side, but the defaults work in most cases. */var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase*/var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance  */var chrsz  = 8; /* bits per input character. 8 - ASCII; 16 - Unicode   *//* * These are the functions you'll usually want to call * They take string arguments and return either hex or base-64 encoded strings */function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}/* * Perform a simple self-test to see if the VM is working */function sha1_vm_test(){ return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";}/* * Calculate the SHA-1 of an array of big-endian words, and a bit length */function core_sha1(x, len){ /* append padding */ x[len  5] |= 0x80  (24 - len % 32); x[((len + 64  9)  4) + 15] = len; var w = Array(80); var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; var e = -1009589776; for(var i = 0; i  x.length; i += 16) {  var olda = a;  var oldb = b;  var oldc = c;  var oldd = d;  var olde = e;  for(var j = 0; j  80; j++)  {   if(j  16) w[j] = x[i + j];   else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);   var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),safe_add(safe_add(e, w[j]), sha1_kt(j)));   e = d;   d = c;   c = rol(b, 30);   b = a;   a = t;  }  a = safe_add(a, olda);  b = safe_add(b, oldb);  c = safe_add(c, oldc);  d = safe_add(d, oldd);  e = safe_add(e, olde); } return Array(a, b, c, d, e);}/* * Perform the appropriate triplet combination function for the current * iteration */function sha1_ft(t, b, c, d){ if(t  20) return (b & c) | ((~b) & d); if(t  40) return b ^ c ^ d; if(t  60) return (b & c) | (b & d) | (c & d); return b ^ c ^ d;}/* * Determine the appropriate additive constant for the current iteration */function sha1_kt(t){ return (t  20) ? 1518500249 : (t  40) ? 1859775393 : (t  60) ? -1894007588 : -899497514;}/* * Calculate the HMAC-SHA1 of a key and some data */function core_hmac_sha1(key, data){ var bkey = str2binb(key); if(bkey.length  16) bkey = core_sha1(bkey, key.length * chrsz); var ipad = Array(16), opad = Array(16); for(var i = 0; i  16; i++) {  ipad[i] = bkey[i] ^ 0x36363636;  opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz); return core_sha1(opad.concat(hash), 512 + 160);}/* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */function safe_add(x, y){ var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x  16) + (y  16) + (lsw  16); return (msw  16) | (lsw & 0xFFFF);}/* * Bitwise rotate a 32-bit number to the left. */function rol(num, cnt){ return (num  cnt) | (num  (32 - cnt));}/* * Convert an 8-bit or 16-bit string to an array of big-endian words * In 8-bit function, characters 255 have their hi-byte silently ignored. */function str2binb(str){ var bin = Array(); var mask = (1  chrsz) - 1; for(var i = 0; i  str.length * chrsz; i += chrsz)  bin[i5] |= (str.charCodeAt(i / chrsz) & mask)  (32 - chrsz - i%32); return bin;}/* * Convert an array of big-endian words to a string */function binb2str(bin){ var str = ""; var mask = (1  chrsz) - 1; for(var i = 0; i  bin.length * 32; i += chrsz)  str += String.fromCharCode((bin[i5]  (32 - chrsz - i%32)) & mask); return str;}/* * Convert an array of big-endian words to a hex string. */function binb2hex(binarray){ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; for(var i = 0; i  binarray.length * 4; i++) {  str += hex_tab.charAt((binarray[i2]  ((3 - i%4)*8+4)) & 0xF) +  hex_tab.charAt((binarray[i2]  ((3 - i%4)*8 )) & 0xF); } return str;}/* * Convert an array of big-endian words to a base-64 string */function binb2b64(binarray){ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var str = ""; for(var i = 0; i  binarray.length * 4; i += 3) {  var triplet = (((binarray[i   2]  8 * (3 - i  %4)) & 0xFF)  16)| (((binarray[i+1  2]  8 * (3 - (i+1)%4)) & 0xFF)  8 )| ((binarray[i+2  2]  8 * (3 - (i+2)%4)) & 0xFF);  for(var j = 0; j  4; j++)  {   if(i * 8 + j * 6  binarray.length * 32) str += b64pad;   else str += tab.charAt((triplet  6*(3-j)) & 0x3F);  } } return str;}

来源:http://www.tulaoshi.com/n/20160219/1598801.html

延伸阅读
标签: Web开发
使用JavaScript数组 在JavaScript 1.0中构造器只存在Date对象和用户定义的对象。你可能期望有个数组构造器,但是一直没能实现,直到JavaScript 1.1的出现,你的期望成为了现实。我们可以如下来定义用户对象: function blankArray(n) { for (var i=0; i n; i++) this[i] = null; this.length = n; } blankArray函数创建了一个数组,这...
标签: Web开发
script src="prototype.js"/scriptscript// 创建一个对象var obj = { key1: 1, key2: 2, key3: 3}; // 将其转换为Hash对象var hash = $H(obj);// 输出 #Hash: {'key1': 1, 'key2' : 2, 'key3': 3}// 输出key1=1&key2=2&key3=3alert("hash.inspect()"+hash.inspect()+"r...
标签: 服务器
Mac OS X如何校验文件的SHA1值以解决文件缺失问题   我们在上传和下载文件的时候,很容易导致文件的缺失,那么该如何解决这个问题呢?用户们通常会使用SHA1 值来检查。今天小编就教大家如何检测文件的SHA1 值吧。 检测方法: 运行终端(应用程序 – 实用工具 – 终端.app),并按以下语法执行检查: ...
标签: Web开发
使用javascript中的OLE Automation 在前面的教程中我们已经有提到JavaScript中的OLE Automation。在本节的教程中,我们将一起来讨论一下JavaScript是怎样利用Automation的强大功能来扩展服务端脚本的能力的。 实际上Automation并不是新的事物。它已经在好几年前就流行了,但是被ActiveX脚本语言的支持是一个新的应用。如果你已经有了Visua...
标签: Web开发
JavaScript 参考教程 本教程为未接触过 JavaScript 的读者提供了比较完善的初级知识,但只限于初级知识:所有与动态网页密切相关的 JavaScript 在本教程中都未提及,包括动态定位、动画、让文档接收更多事件(document.captureEvent())等;所有在 IE 及 Netscape 中有不同的 JavaScript 都尽少提及。 本教程在结构上设计的比...

经验教程

170

收藏

79
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部