11
11
define ("HASH_SALT_INDEX " , 2 );
12
12
define ("HASH_PBKDF2_INDEX " , 3 );
13
13
14
- function create_hash ($ password )
15
- {
16
- $ salt = base64_encode (mcrypt_create_iv (PBKDF2_SALT_BYTES , MCRYPT_DEV_URANDOM ));
17
- return PBKDF2_HASH_ALGORITHM . ": " . PBKDF2_ITERATIONS . ": " . $ salt . ": " .
18
- base64_encode (pbkdf2 (
19
- PBKDF2_HASH_ALGORITHM ,
20
- $ password ,
21
- $ salt ,
22
- PBKDF2_ITERATIONS ,
23
- PBKDF2_HASH_BYTES ,
24
- true
25
- ));
26
- }
14
+ class Password {
27
15
28
- function validate_password ($ password , $ good_hash )
29
- {
30
- $ params = explode (": " , $ good_hash );
31
- if (count ($ params ) < HASH_SECTIONS )
32
- return false ;
33
- $ pbkdf2 = base64_decode ($ params [HASH_PBKDF2_INDEX ]);
34
- return slow_equals (
35
- $ pbkdf2 ,
36
- pbkdf2 (
37
- $ params [HASH_ALGORITHM_INDEX ],
38
- $ password ,
39
- $ params [HASH_SALT_INDEX ],
40
- (int )$ params [HASH_ITERATION_INDEX ],
41
- strlen ($ pbkdf2 ),
42
- true
43
- )
44
- );
45
- }
46
-
47
- function slow_equals ($ a , $ b )
48
- {
49
- $ diff = strlen ($ a ) ^ strlen ($ b );
50
- for ($ i = 0 ; $ i < strlen ($ a ) && $ i < strlen ($ b ); $ i ++)
16
+ public static function create_hash ($ password )
51
17
{
52
- $ diff |= ord ($ a [$ i ]) ^ ord ($ b [$ i ]);
18
+ $ salt = base64_encode (mcrypt_create_iv (PBKDF2_SALT_BYTES , MCRYPT_DEV_URANDOM ));
19
+ return PBKDF2_HASH_ALGORITHM . ": " . PBKDF2_ITERATIONS . ": " . $ salt . ": " .
20
+ base64_encode (self ::pbkdf2 (
21
+ PBKDF2_HASH_ALGORITHM ,
22
+ $ password ,
23
+ $ salt ,
24
+ PBKDF2_ITERATIONS ,
25
+ PBKDF2_HASH_BYTES ,
26
+ true
27
+ ));
53
28
}
54
- return $ diff === 0 ;
55
- }
56
-
57
- function pbkdf2 ($ algorithm , $ password , $ salt , $ count , $ key_length , $ raw_output = false )
58
- {
59
- $ algorithm = strtolower ($ algorithm );
60
- if (!in_array ($ algorithm , hash_algos (), true ))
61
- die ('PBKDF2 ERROR: Invalid hash algorithm. ' );
62
- if ($ count <= 0 || $ key_length <= 0 )
63
- die ('PBKDF2 ERROR: Invalid parameters. ' );
64
-
65
- $ hash_length = strlen (hash ($ algorithm , "" , true ));
66
- $ block_count = ceil ($ key_length / $ hash_length );
67
-
68
- $ output = "" ;
69
- for ($ i = 1 ; $ i <= $ block_count ; $ i ++) {
70
- // $i encoded as 4 bytes, big endian.
71
- $ last = $ salt . pack ("N " , $ i );
72
- // first iteration
73
- $ last = $ xorsum = hash_hmac ($ algorithm , $ last , $ password , true );
74
- // perform the other $count - 1 iterations
75
- for ($ j = 1 ; $ j < $ count ; $ j ++) {
76
- $ xorsum ^= ($ last = hash_hmac ($ algorithm , $ last , $ password , true ));
29
+
30
+ public static function validate_password ($ password , $ good_hash )
31
+ {
32
+ $ params = explode (": " , $ good_hash );
33
+ if (count ($ params ) < HASH_SECTIONS )
34
+ return false ;
35
+ $ pbkdf2 = base64_decode ($ params [HASH_PBKDF2_INDEX ]);
36
+ return self ::slow_equals (
37
+ $ pbkdf2 ,
38
+ self ::pbkdf2 (
39
+ $ params [HASH_ALGORITHM_INDEX ],
40
+ $ password ,
41
+ $ params [HASH_SALT_INDEX ],
42
+ (int )$ params [HASH_ITERATION_INDEX ],
43
+ strlen ($ pbkdf2 ),
44
+ true
45
+ )
46
+ );
47
+ }
48
+
49
+ public static function slow_equals ($ a , $ b )
50
+ {
51
+ $ diff = strlen ($ a ) ^ strlen ($ b );
52
+ for ($ i = 0 ; $ i < strlen ($ a ) && $ i < strlen ($ b ); $ i ++)
53
+ {
54
+ $ diff |= ord ($ a [$ i ]) ^ ord ($ b [$ i ]);
55
+ }
56
+ return $ diff === 0 ;
57
+ }
58
+
59
+ public static function pbkdf2 ($ algorithm , $ password , $ salt , $ count , $ key_length , $ raw_output = false )
60
+ {
61
+ $ algorithm = strtolower ($ algorithm );
62
+ if (!in_array ($ algorithm , hash_algos (), true ))
63
+ die ('PBKDF2 ERROR: Invalid hash algorithm. ' );
64
+ if ($ count <= 0 || $ key_length <= 0 )
65
+ die ('PBKDF2 ERROR: Invalid parameters. ' );
66
+
67
+ $ hash_length = strlen (hash ($ algorithm , "" , true ));
68
+ $ block_count = ceil ($ key_length / $ hash_length );
69
+
70
+ $ output = "" ;
71
+ for ($ i = 1 ; $ i <= $ block_count ; $ i ++) {
72
+ // $i encoded as 4 bytes, big endian.
73
+ $ last = $ salt . pack ("N " , $ i );
74
+ // first iteration
75
+ $ last = $ xorsum = hash_hmac ($ algorithm , $ last , $ password , true );
76
+ // perform the other $count - 1 iterations
77
+ for ($ j = 1 ; $ j < $ count ; $ j ++) {
78
+ $ xorsum ^= ($ last = hash_hmac ($ algorithm , $ last , $ password , true ));
79
+ }
80
+ $ output .= $ xorsum ;
77
81
}
78
- $ output .= $ xorsum ;
82
+
83
+ if ($ raw_output )
84
+ return substr ($ output , 0 , $ key_length );
85
+ else
86
+ return bin2hex (substr ($ output , 0 , $ key_length ));
79
87
}
80
88
81
- if ($ raw_output )
82
- return substr ($ output , 0 , $ key_length );
83
- else
84
- return bin2hex (substr ($ output , 0 , $ key_length ));
85
- }
89
+ }
0 commit comments