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 相关文章推荐
音乐播放用的的几个函数
Sep 07 Javascript
jquery.boxy插件的iframe扩展代码
Jul 02 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
Nov 22 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
DOM 高级编程
May 06 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
Jun 03 Javascript
基于JQuery的购物车添加删除以及结算功能示例
Mar 08 Javascript
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
如何实现一个简易版的vuex持久化工具
Sep 11 Javascript
浅析vue中的provide / inject 有什么用处
Nov 10 Javascript
VUE中使用HTTP库Axios方法详解
Feb 05 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获取指定范围内最接近数的方法
2015/06/02 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
chrome原生方法之数组
2011/11/30 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
Python字典操作简明总结
2015/04/13 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
Python 高级专用类方法的实例详解
2017/09/11 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
python3 配置logging日志类的操作
2020/04/08 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
python基于opencv实现人脸识别
2021/01/04 Python
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
大专生工程监理求职信
2013/10/04 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
聘任通知书
2015/09/21 职场文书