Showing
1 changed file
with
119 additions
and
0 deletions
utils/authcode.js
0 → 100644
1 | +'use strict'; | ||
2 | +const md5 = require('md5'); | ||
3 | + | ||
4 | +const microtime = function() { | ||
5 | + let unixtimeMs = new Date().getTime(); | ||
6 | + let sec = parseInt(unixtimeMs / 1000, 10); | ||
7 | + | ||
8 | + return (unixtimeMs - (sec * 1000)) / 1000 + ' ' + sec; | ||
9 | +}; | ||
10 | + | ||
11 | +const getTimestamp = function() { | ||
12 | + let unixtimeMs = new Date().getTime(); | ||
13 | + | ||
14 | + return parseInt(unixtimeMs / 1000, 10); | ||
15 | +}; | ||
16 | + | ||
17 | +module.exports = function(str, operation, key, expiry) { | ||
18 | + operation = operation ? operation : 'encode'; | ||
19 | + key = key ? key : ''; | ||
20 | + expiry = expiry ? expiry : 0; | ||
21 | + let tmpstr, tmp; | ||
22 | + | ||
23 | + let ckeyLength = 4; | ||
24 | + | ||
25 | + key = md5(key); | ||
26 | + | ||
27 | + // 密匙a会参与加解密 | ||
28 | + let keya = md5(key.substr(0, 16)); | ||
29 | + | ||
30 | + // 密匙b会用来做数据完整性验证 | ||
31 | + let keyb = md5(key.substr(16, 16)); | ||
32 | + | ||
33 | + // 密匙c用于变化生成的密文 | ||
34 | + let keyc = operation === 'decode' ? | ||
35 | + str.substr(0, ckeyLength) : md5(microtime()).substr(-ckeyLength); | ||
36 | + | ||
37 | + // 参与运算的密匙 | ||
38 | + let cryptkey = keya + md5(keya + keyc); | ||
39 | + | ||
40 | + let strbuf; | ||
41 | + | ||
42 | + if (operation === 'decode') { | ||
43 | + str = str.substr(ckeyLength); | ||
44 | + strbuf = new Buffer(str, 'base64'); | ||
45 | + | ||
46 | + // string = b.toString(); | ||
47 | + } else { | ||
48 | + expiry = expiry ? expiry + getTimestamp() : 0; | ||
49 | + tmpstr = expiry.toString(); | ||
50 | + if (tmpstr.length >= 10) { | ||
51 | + str = tmpstr.substr(0, 10) + md5(str + keyb).substr(0, 16) + str; | ||
52 | + } else { | ||
53 | + let count = 10 - tmpstr.length; | ||
54 | + | ||
55 | + for (let i = 0; i < count; i++) { | ||
56 | + tmpstr = '0' + tmpstr; | ||
57 | + } | ||
58 | + str = tmpstr + md5(str + keyb).substr(0, 16) + str; | ||
59 | + } | ||
60 | + strbuf = new Buffer(str); | ||
61 | + } | ||
62 | + | ||
63 | + | ||
64 | + let box = new Array(256); | ||
65 | + let rndkey = []; | ||
66 | + | ||
67 | + for (let i = 0; i < 256; i++) { | ||
68 | + box[i] = i; | ||
69 | + | ||
70 | + // 产生密匙簿 | ||
71 | + rndkey[i] = cryptkey.charCodeAt(i % cryptkey.length); | ||
72 | + } | ||
73 | + | ||
74 | + // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度 | ||
75 | + for (let j = 0, i = 0; i < 256; i++) { | ||
76 | + j = (j + box[i] + rndkey[i]) % 256; | ||
77 | + tmp = box[i]; | ||
78 | + box[i] = box[j]; | ||
79 | + box[j] = tmp; | ||
80 | + } | ||
81 | + | ||
82 | + | ||
83 | + // 核心加解密部分 | ||
84 | + let s = ''; | ||
85 | + | ||
86 | + for (let a = 0, j = 0, i = 0; i < strbuf.length; i++) { | ||
87 | + a = (a + 1) % 256; | ||
88 | + j = (j + box[a]) % 256; | ||
89 | + tmp = box[a]; | ||
90 | + box[a] = box[j]; | ||
91 | + box[j] = tmp; | ||
92 | + | ||
93 | + // 从密匙簿得出密匙进行异或,再转成字符 | ||
94 | + // s += String.fromCharCode(string[i] ^ (box[(box[a] + box[j]) % 256])); | ||
95 | + /* jshint -W016*/ | ||
96 | + strbuf[i] = strbuf[i] ^ (box[(box[a] + box[j]) % 256]); | ||
97 | + } | ||
98 | + | ||
99 | + if (operation === 'decode') { | ||
100 | + s = strbuf.toString(); | ||
101 | + if ((s.substr(0, 10) === '0'.repeat(10) || | ||
102 | + s.substr(0, 10) - getTimestamp() > 0) && | ||
103 | + s.substr(10, 16) === md5(s.substr(26) + keyb).substr(0, 16)) { | ||
104 | + s = s.substr(26); | ||
105 | + } else { | ||
106 | + s = ''; | ||
107 | + } | ||
108 | + } else { | ||
109 | + s = strbuf.toString('base64'); | ||
110 | + let regex = new RegExp('=', 'g'); | ||
111 | + | ||
112 | + s = s.replace(regex, ''); | ||
113 | + s = keyc + s; | ||
114 | + } | ||
115 | + | ||
116 | + return s; | ||
117 | +}; | ||
118 | + | ||
119 | +// console.log(module.exports('abcdef123', 'encode', 'key123', 99)) |
-
Please register or login to post a comment