password-hash.test.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import assert from 'node:assert/strict';
  2. import { test } from 'node:test';
  3. import {
  4. hashPassword,
  5. isLegacyPasswordHash,
  6. verifyPassword,
  7. verifyScryptPassword,
  8. verifyVestaPassword
  9. } from '../src/password-hash.js';
  10. test('hashes and verifies current scrypt passwords', () => {
  11. const stored = hashPassword('correct horse battery staple');
  12. assert.match(stored, /^scrypt\$[0-9a-f]{32}\$[0-9a-f]{128}$/);
  13. assert.equal(verifyScryptPassword('correct horse battery staple', stored), true);
  14. assert.equal(verifyPassword('correct horse battery staple', stored), true);
  15. assert.equal(verifyPassword('wrong password', stored), false);
  16. });
  17. test('verifies Vesta MD5-CRYPT passwords with known vectors', () => {
  18. const passwordVector = '$1$hfT7jp2q$G3yf0NUx7mUkX.LIFWQxN.';
  19. const unicodeVector = '$1$salt1234$VwTk0ScCcREDNl.8aCJCc0';
  20. assert.equal(verifyVestaPassword('password', `{MD5}${passwordVector}`), true);
  21. assert.equal(verifyVestaPassword('password', `{MD5-CRYPT}${passwordVector}`), true);
  22. assert.equal(verifyVestaPassword('pässwörd', unicodeVector), true);
  23. assert.equal(verifyPassword('password', `{MD5}${passwordVector}`), true);
  24. assert.equal(verifyVestaPassword('wrong password', `{MD5}${passwordVector}`), false);
  25. });
  26. test('detects only supported legacy password hashes', () => {
  27. assert.equal(isLegacyPasswordHash('{MD5}$1$12345678$xek.CpjQUVgdf/P2N9KQf/'), true);
  28. assert.equal(isLegacyPasswordHash('{MD5-CRYPT}$1$12345678$xek.CpjQUVgdf/P2N9KQf/'), true);
  29. assert.equal(isLegacyPasswordHash('$1$12345678$xek.CpjQUVgdf/P2N9KQf/'), true);
  30. assert.equal(isLegacyPasswordHash('{SHA256-CRYPT}$5$salt$hash'), false);
  31. assert.equal(isLegacyPasswordHash('{MD5}$1$toolongsalt$invalid'), false);
  32. assert.equal(verifyPassword('password', 'malformed'), false);
  33. });