-
Notifications
You must be signed in to change notification settings - Fork 9
/
security.ts
127 lines (107 loc) 路 3.04 KB
/
security.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//
import * as forge from 'node-forge'
export const LENGTHS = (({
uuid: 32 as any,
finger: 32 as any,
prime: 32 as any,
bits: 32 as any,
token: 64 as any,
} as Security.Doc) as any) as { [key: string]: number }
export function md5(value: string): string {
let hash = forge.md.md5.create()
hash.update(value)
return hash.digest().toHex()
}
export function sha1(value: string): string {
let hash = forge.md.sha1.create()
hash.update(value)
return hash.digest().toHex()
}
export function hash256(value: string): string {
let hash = forge.md.sha512.sha256.create()
hash.update(value)
return hash.digest().toHex()
}
export function hmac256(message: string, prime: string): string {
let hash = forge.hmac.create()
hash.start('sha256', prime)
hash.update(message)
return hash.digest().toHex()
}
export function randomBytes(size: number): string {
return forge.util.bytesToHex(forge.random.getBytesSync(Math.round(size * 0.5)))
}
export function randomBits(size: number): string {
let bits = ''
while (bits.length < size && size > 0) {
let rand = Math.random()
bits += (rand < 0.1 ? Math.floor(rand * 100) : String.fromCharCode(Math.floor(rand * 26) + (rand > 0.5 ? 97 : 65)))
}
return bits
}
export function generateProbablePrime(size: number): Promise<string> {
return new Promise<string>(function(resolve, reject) {
forge.prime.generateProbablePrime((size * 4), function(error, result) {
if (error) return reject(error);
resolve(result.toString(16))
})
})
}
export function generatePemKeyPair(size: number): Promise<Security.PemKeyPair> {
return new Promise(function(resolve, reject) {
let opts = { bits: size, workers: -1 } as any
forge.pki.rsa.generateKeyPair(opts, function(error, keypair) {
if (error) return reject(error);
resolve(keypair)
})
}).then(function(keypair: forge.pki.KeyPair) {
return Promise.resolve({
publicPem: forge.pki.publicKeyToPem(keypair.publicKey),
privatePem: forge.pki.privateKeyToPem(keypair.privateKey),
} as Security.PemKeyPair)
})
}
export function encryptObjectValues<T = any>(decrypted: T, publicPem: string): T {
let publicKey = forge.pki.publicKeyFromPem(publicPem)
let encrypted = {} as T
Object.keys(decrypted).forEach(function(key) {
let value = decrypted[key]
if (value == null) return;
encrypted[key] = publicKey.encrypt(value)
})
return encrypted
}
export function decryptObjectValues<T = any>(encrypted: T, privatePem: string): T {
let privateKey = forge.pki.privateKeyFromPem(privatePem)
let decrypted = {} as T
Object.keys(encrypted).forEach(function(key) {
let value = encrypted[key]
if (value == null) return;
decrypted[key] = privateKey.decrypt(value)
})
return decrypted
}
declare global {
namespace Security {
interface Doc {
rkey: string
ip: string
uuid: string
finger: string
bits: string
token: string
useragent: string
stamp: number
prime: string
ishuman: boolean
rhusername: string
rhaccount: string
rhtoken: string
rhrefresh: string
}
interface PemKeyPair {
publicPem: string
privatePem: string
}
}
}