@@ -3,12 +3,8 @@ import * as SparkMD5 from 'spark-md5';
3
3
4
4
import { PrecomputedFlag } from './interfaces' ;
5
5
6
- export function getMD5Hash ( input : string ) : string {
7
- return SparkMD5 . hash ( input ) ;
8
- }
9
-
10
- function saltedHasher ( salt : string ) {
11
- return ( input : string ) => getMD5Hash ( salt + input ) ;
6
+ export function getMD5Hash ( input : string , salt = '' ) : string {
7
+ return new SparkMD5 ( ) . append ( salt ) . append ( input ) . end ( ) ;
12
8
}
13
9
14
10
export function encodeBase64 ( input : string ) {
@@ -24,7 +20,6 @@ export function obfuscatePrecomputedFlags(
24
20
precomputedFlags : Record < string , PrecomputedFlag > ,
25
21
) : Record < string , PrecomputedFlag > {
26
22
const response : Record < string , PrecomputedFlag > = { } ;
27
- const hash = saltedHasher ( salt ) ;
28
23
29
24
Object . keys ( precomputedFlags ) . map ( ( flagKey ) => {
30
25
const assignment = precomputedFlags [ flagKey ] ;
@@ -34,7 +29,7 @@ export function obfuscatePrecomputedFlags(
34
29
Object . entries ( assignment . extraLogging ) . map ( ( kvArr ) => kvArr . map ( encodeBase64 ) ) ,
35
30
) ;
36
31
37
- const hashedKey = hash ( flagKey ) ;
32
+ const hashedKey = getMD5Hash ( flagKey , salt ) ;
38
33
response [ hashedKey ] = {
39
34
flagKey : hashedKey ,
40
35
variationType : assignment . variationType ,
@@ -48,30 +43,29 @@ export function obfuscatePrecomputedFlags(
48
43
return response ;
49
44
}
50
45
51
- export interface Salt {
46
+ export interface ISalt {
52
47
saltString : string ;
53
48
base64String : string ;
54
49
bytes : Uint8Array ;
55
50
}
56
51
57
- let _saltOverride : Salt | null = null ;
58
- export function setSaltOverrideForTests ( salt : Salt | null ) {
59
- _saltOverride = salt ;
52
+ export class Salt implements ISalt {
53
+ public readonly saltString : string ;
54
+ public readonly base64String : string ;
55
+ constructor ( public readonly bytes : Uint8Array ) {
56
+ this . saltString = String . fromCharCode ( ...bytes ) ;
57
+ this . base64String = encodeBase64 ( this . saltString ) ;
58
+ }
59
+ }
60
+
61
+ let _saltOverride : ISalt | null = null ;
62
+ export function setSaltOverrideForTests ( salt : Uint8Array | null ) {
63
+ _saltOverride = salt ? new Salt ( salt ) : null ;
60
64
}
61
65
62
- export function generateSalt ( length = 16 ) : Salt {
66
+ export function generateSalt ( length = 16 ) : ISalt {
63
67
if ( _saltOverride ) return _saltOverride ;
64
68
const array = new Uint8Array ( length ) ;
65
69
crypto . getRandomValues ( array ) ;
66
-
67
- const saltString = Array . from ( array )
68
- . map ( ( byte ) => byte . toString ( 16 ) . padStart ( 2 , '0' ) )
69
- . join ( '' ) ;
70
- const base64String = encodeBase64 ( String . fromCharCode ( ...array ) ) ;
71
-
72
- return {
73
- saltString,
74
- base64String,
75
- bytes : array ,
76
- } ;
70
+ return new Salt ( array ) ;
77
71
}
0 commit comments