Skip to content

Commit 7d4341d

Browse files
use sha256 as default hasher of PBKDF2
use sha256 with iterations of 250000 as default hasher of PBKDF2 to prevent weak security problem related to CVE-2023-46233 of crypto-js
1 parent 596159e commit 7d4341d

File tree

3 files changed

+23
-23
lines changed

3 files changed

+23
-23
lines changed

src/algo/pbkdf2/pbkdf2.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {
22
Base,
33
WordArray
44
} from '../../core/core.js';
5-
import { SHA1Algo } from '../hash/sha1.js';
5+
import { SHA256Algo } from '../hash/sha256.js';
66
import { HMAC } from '../hmac/hmac.js';
77

88

@@ -28,28 +28,28 @@ export class PBKDF2Algo extends Base {
2828
* Configuration options.
2929
*
3030
* @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
31-
* @property {Hasher} hasher The hasher to use. Default: SHA1
32-
* @property {number} iterations The number of iterations to perform. Default: 1
31+
* @property {Hasher} hasher The hasher to use. Default: SHA256
32+
* @property {number} iterations The number of iterations to perform. Default: 250000
3333
*/
3434
this.cfg = Object.assign(
3535
new Base(),
3636
{
3737
keySize: 128 / 32,
38-
hasher: SHA1Algo,
39-
iterations: 1
38+
hasher: SHA256Algo,
39+
iterations: 250000
4040
},
4141
cfg
4242
);
4343
}
4444

4545
/**
46-
* SHA1 is the default hasher of pbkdf2.
46+
* SHA256 is the default hasher of pbkdf2.
4747
* With another hasher configured, user should call the corresponding loadWasm of the configured hasher.
4848
*
4949
* @returns {Promise<null>}
5050
*/
5151
static async loadWasm() {
52-
return SHA1Algo.loadWasm();
52+
return SHA256Algo.loadWasm();
5353
}
5454

5555
async loadWasm() {

test/algo.pbkdf2.profile.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import C from '../src/index';
22

33
beforeAll(async () => {
4-
await C.SHA1.loadWasm();
4+
await C.SHA256.loadWasm();
55
});
66

77
describe('algo-pbkdf2-profile', () => {

test/algo.pbkdf2.test.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,104 @@
11
import C from '../src/index';
22

33
beforeAll(async () => {
4-
await C.SHA1.loadWasm();
4+
await C.SHA256.loadWasm();
55
});
66

77
describe('algo-pbkdf2-test', () => {
88
test('testKeySize128', () => {
99
expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', {
1010
keySize: 128 / 32
11-
}).toString()).toBe('cdedb5281bb2f801565a1122b2563515');
11+
}).toString()).toBe('62929ab995a1111c75c37bc562261ea3');
1212
});
1313

1414
test('testKeySize256', () => {
1515
expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', {
1616
keySize: 256 / 32
17-
}).toString()).toBe('cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837');
17+
}).toString()).toBe('62929ab995a1111c75c37bc562261ea3fb3cdc7e725c4ca87c03cec5bb7663e1');
1818
});
1919

2020
test('testKeySize128Iterations2', () => {
2121
expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', {
2222
keySize: 128 / 32,
2323
iterations: 2
24-
}).toString()).toBe('01dbee7f4a9e243e988b62c73cda935d');
24+
}).toString()).toBe('262fb72ea65b44ab5ceba7f8c8bfa781');
2525
});
2626

2727
test('testKeySize256Iterations2', () => {
2828
expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', {
2929
keySize: 256 / 32,
3030
iterations: 2
31-
}).toString()).toBe('01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86');
31+
}).toString()).toBe('262fb72ea65b44ab5ceba7f8c8bfa7815ff9939204eb7357a59a75877d745777');
3232
});
3333

3434
test('testKeySize128Iterations1200', () => {
3535
expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', {
3636
keySize: 128 / 32,
3737
iterations: 1200
38-
}).toString()).toBe('5c08eb61fdf71e4e4ec3cf6ba1f5512b');
38+
}).toString()).toBe('c76a982415f1acc71dc197273c5b6ada');
3939
});
4040

4141
test('testKeySize256Iterations1200', () => {
4242
expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', {
4343
keySize: 256 / 32,
4444
iterations: 1200
45-
}).toString()).toBe('5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13');
45+
}).toString()).toBe('c76a982415f1acc71dc197273c5b6ada32f62915ed461718aad32843762433fa');
4646
});
4747

4848
test('testKeySize128Iterations5', () => {
4949
expect(C.PBKDF2('password', C.enc.Hex.parse('1234567878563412'), {
5050
keySize: 128 / 32,
5151
iterations: 5
52-
}).toString()).toBe('d1daa78615f287e6a1c8b120d7062a49');
52+
}).toString()).toBe('74e98b2e9eeddaab3113c1efc6d82b07');
5353
});
5454

5555
test('testKeySize256Iterations5', () => {
5656
expect(C.PBKDF2('password', C.enc.Hex.parse('1234567878563412'), {
5757
keySize: 256 / 32,
5858
iterations: 5
59-
}).toString()).toBe('d1daa78615f287e6a1c8b120d7062a493f98d203e6be49a6adf4fa574b6e64ee');
59+
}).toString()).toBe('74e98b2e9eeddaab3113c1efc6d82b073c4860195b3e0737fa21a4778f376321');
6060
});
6161

6262
test('testKeySize128Iterations1200PassPhraseEqualsBlockSize', () => {
6363
expect(C.PBKDF2('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'pass phrase equals block size', {
6464
keySize: 128 / 32,
6565
iterations: 1200
66-
}).toString()).toBe('139c30c0966bc32ba55fdbf212530ac9');
66+
}).toString()).toBe('c1dfb29a4d2f2fb67c6f78d074d66367');
6767
});
6868

6969
test('testKeySize256Iterations1200PassPhraseEqualsBlockSize', () => {
7070
expect(C.PBKDF2('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'pass phrase equals block size', {
7171
keySize: 256 / 32,
7272
iterations: 1200
73-
}).toString()).toBe('139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1');
73+
}).toString()).toBe('c1dfb29a4d2f2fb67c6f78d074d663671e6fd4da1e598572b1fecf256cb7cf61');
7474
});
7575

7676
test('testKeySize128Iterations1200PassPhraseExceedsBlockSize', () => {
7777
expect(C.PBKDF2('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'pass phrase exceeds block size', {
7878
keySize: 128 / 32,
7979
iterations: 1200
80-
}).toString()).toBe('9ccad6d468770cd51b10e6a68721be61');
80+
}).toString()).toBe('22344bc4b6e32675a8090f3ea80be01d');
8181
});
8282

8383
test('testKeySize256Iterations1200PassPhraseExceedsBlockSize', () => {
8484
expect(C.PBKDF2('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'pass phrase exceeds block size', {
8585
keySize: 256 / 32,
8686
iterations: 1200
87-
}).toString()).toBe('9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a');
87+
}).toString()).toBe('22344bc4b6e32675a8090f3ea80be01d5f95126a2cddc3facc4a5e6dca04ec58');
8888
});
8989

9090
test('testKeySize128Iterations50', () => {
9191
expect(C.PBKDF2(C.enc.Hex.parse('f09d849e'), 'EXAMPLE.COMpianist', {
9292
keySize: 128 / 32,
9393
iterations: 50
94-
}).toString()).toBe('6b9cf26d45455a43a5b8bb276a403b39');
94+
}).toString()).toBe('44b0781253db3141ac4174af29325818');
9595
});
9696

9797
test('testKeySize256Iterations50', () => {
9898
expect(C.PBKDF2(C.enc.Hex.parse('f09d849e'), 'EXAMPLE.COMpianist', {
9999
keySize: 256 / 32,
100100
iterations: 50
101-
}).toString()).toBe('6b9cf26d45455a43a5b8bb276a403b39e7fe37a0c41e02c281ff3069e1e94f52');
101+
}).toString()).toBe('44b0781253db3141ac4174af29325818584698d507a79f9879033dec308a2b77');
102102
});
103103

104104
test('testInputIntegrity', () => {

0 commit comments

Comments
 (0)