Guest User

Untitled

a guest
Feb 10th, 2018
521
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. const crypto = require("crypto");
  2.  
  3. class Db {
  4. constructor(users={}) {
  5. this.users = users;
  6. }
  7.  
  8. // Expects passwordPayload to be a string of the form 'salt$passwordHash'
  9. // Where the '$' is used as a separator.
  10. storeUser(username, passwordPayload) {
  11. this.users[username] = passwordPayload;
  12. }
  13.  
  14. getUserPassword(username) {
  15. let hash = this.users[username];
  16. return {
  17. salt: hash.substr(0, hash.indexOf('$')),
  18. passwordHash: hash.substr(hash.indexOf('$') + 1)
  19. };
  20. }
  21. }
  22. const db = new Db();
  23.  
  24.  
  25. // STUDENT CODE STARTS HERE ------------
  26.  
  27. const hashPassword = (password, salt) => {
  28. const passwordHash = crypto.pbkdf2Sync(password, salt, 70451, 64, 'sha256');
  29. return passwordHash.toString('hex');
  30. };
  31.  
  32. const saveUser = (username, password) => {
  33. const salt = crypto.randomBytes(64).toString('hex');
  34. const passwordHash = hashPassword(password, salt);
  35. const payload = `${salt}$${passwordHash}`;
  36. db.storeUser(username, payload);
  37. };
  38.  
  39. // Return true if authenticated, false otherwise.
  40. const isUserAuthenticated = (username, password) => {
  41. let payload;
  42. try {
  43. payload = db.getUserPassword(username);
  44. } catch (error) {
  45. if (!(error instanceof TypeError)) throw error;
  46.  
  47. // insert work
  48. hashPassword('notARealPassword', 'mySaltIsbetterThanMyPepper');
  49.  
  50. return false;
  51. }
  52.  
  53. const { salt, passwordHash } = payload;
  54.  
  55. return comparePasswords(password, salt, passwordHash);
  56. };
  57.  
  58. // returns true if passwords match, otherwise false.
  59. const comparePasswords = (plaintextPassword, salt, passwordHashFromDb) => {
  60. return hashPassword(plaintextPassword, salt) === passwordHashFromDb;
  61. };
  62.  
  63. // STUDENT CODE ENDS HERE ------------
  64.  
  65. saveUser('jane@email.com', '123456qwerty');
  66.  
  67. console.time('1')
  68. console.log(isUserAuthenticated('jane@email.com', 'HelloWorld!')) // false
  69. console.timeEnd('1')
  70. console.time('2')
  71. console.log(isUserAuthenticated('jane@email.com', 'HelloWorld!')) // false
  72. console.timeEnd('2')
  73. console.time('3')
  74. console.log(isUserAuthenticated('iAmNotInTheDb@email.com', 'HelloWorld!')) // false
  75. console.timeEnd('3')
  76. console.time('4')
  77. console.log(isUserAuthenticated('jane@email.com', '123456qwerty')) // true
  78. console.timeEnd('4')
Add Comment
Please, Sign In to add comment