AngularJs自定义服务之实现签名和加密


Posted in Javascript onAugust 02, 2016

写在前面:

AngularJS 是一个 JavaScript 框架。它可通过 <script> 标签添加到 HTML 页面。

AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML。

AngularJs自定义服务之实现签名和加密

angularJS是google公司主推的js开发优秀框架...

页面展示:

在应用中进行加密是普遍存在的,个人建议在前端实现加密签名(前端加密是否必要来自知乎:http://www.zhihu.com/question/25539382)

AngularJs自定义服务之实现签名和加密

对base64、md5、sha1加密算法简单解释:

1、base64是可逆的、对称的加密算法;base64具有64个基本字符组成的基本字符集

AngularJs自定义服务之实现签名和加密

base64加密原理:

a、base64以3个字节为一组,而一个字节占8个位(bit)

b、再把24bit分为四组,每组6bit

c、再在每组高二位补00,扩展为32bit,形成四个字节

2、md5签名是不可逆的消息摘要算法;即不能被解密(从密文到明文)(请参考百度:http://baike.baidu.com/view/7636.htm)MD5会产生一个128位消息摘要

a、填充:首先需要对信息进行填充,使其位长对512求余的结果等于448;

b、初始化变量:初始的128位值为初试链接变量,这些参数用于第一轮的运算,以大端字节序来表示,他们分别为: A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210

  c、处理分组数据

d、输出:输出是a、b、c和d的级联

3、sha1签名是不可逆的数字签名算法(请参考百度:http://baike.baidu.com/view/1228622.htm)SHA1会产生一个160位的消息摘要

a、填充:首先需要对信息进行填充,使其位长对512求余的结果等于448;

  b、补长度:所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。

  c、使用的常量

  d、使用的函数:在SHA1中我们需要一系列的函数。每个函数ft (0 <= t <= 79)都操作32位字B,C,D并且产生32位字作为输出

e、计算消息摘要:必须使用进行了补位和补长度后的消息来计算消息摘要。

登录控制模块:

AngularJs自定义服务之实现签名和加密

服务模块:

AngularJs自定义服务之实现签名和加密

var encryption = angular.module('Encryption', []);
encryption.service('Md5', function(){
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 */
/**
* 供外部调用的方法
*/
this.hex_md5 = function(s) { 
return binl2hex(core_md5(str2binl(s), s.length * chrsz));
}
/*
* Calculate the MD5 of an array of little-endian words, and a bit length
*/
function core_md5(x, len) {
/* append padding */
x[len >> 5] |= 0x80 << ((len) % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
for(var i = 0; i < x.length; i += 16)
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
a = safe_add(a, olda);
b = safe_add(b, oldb);
c = safe_add(c, oldc);
d = safe_add(d, oldd);
}
return Array(a, b, c, d);
}
}).
service('Base64', function(){
_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
// public method for encoding
this.encode = function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = _utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
}
return output;
}
// private method for UTF-8 encoding
_utf8_encode = function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
}).
service('Sha1', function(){
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 */
/* 
* 供外部调用的方法 
*/
this.hex_sha1 = function (s) {
return binb2hex(core_sha1(str2binb(s), s.length * chrsz));
}
/* 
* 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);
} 
})

文件结构:

AngularJs自定义服务之实现签名和加密

以上所述是小编给大家介绍的AngularJs自定义服务之实现签名和加密,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
取选中的radio的值
Jan 11 Javascript
javascript 三种编解码方式
Feb 01 Javascript
javascript 仿QQ滑动菜单效果代码
Sep 03 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
Mar 26 Javascript
jQuery使用之处理页面元素用法实例
Jan 19 Javascript
Bootstrap登陆注册页面开发教程
Jul 12 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
详解js删除数组中的指定元素
Oct 31 Javascript
elementUI中Table表格问题的解决方法
Dec 04 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
Jul 04 Javascript
从零使用TypeScript开发项目打包发布到npm
Feb 14 Javascript
浅谈Cookie的生命周期问题
Aug 02 #Javascript
jQuery实现的兼容性浮动层示例
Aug 02 #Javascript
AngularJS基础 ng-init 指令简单示例
Aug 02 #Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 #Javascript
基于Vue.js实现数字拼图游戏
Aug 02 #Javascript
js 获取范围内的随机数实例代码
Aug 02 #Javascript
url传递的参数值中包含&amp;时,url自动截断问题的解决方法
Aug 02 #Javascript
You might like
php 获取百度的热词数据的代码
2012/02/18 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
php中函数前加&amp;符号的作用分解
2014/07/08 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
stripos函数知识点实例分享
2019/02/11 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
Python可变参数用法实例分析
2017/04/02 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
对python PLT中的image和skimage处理图片方法详解
2019/01/10 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
四议两公开实施方案
2014/03/28 职场文书
毕业评语大全
2014/05/04 职场文书
少年雷锋观后感
2015/06/10 职场文书
大学同学聚会感言
2015/07/30 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
html5调用摄像头截图功能
2022/01/18 Javascript
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript
mysql sock 文件解析及作用讲解
2022/07/15 MySQL