iT邦幫忙

0

Day 20 | 註冊 API:密碼不能明文存,用 bcrypt 雜湊

  • 分享至 

  • xImage
  •  

今天做註冊功能,重點是資料庫裡不能出現使用者的原始密碼。

今天做的事
新增routes/auth.js,驗證帳號長度(3到20字)和密碼長度(至少6字),用bcrypt.hash雜湊之後才寫入資料庫:

const hash = await bcrypt.hash(password, 10);
db.run('INSERT INTO users (username, password_hash) VALUES (?, ?)', [username, hash], function (err) {
  if (err) {
    if (err.code === 'SQLITE_CONSTRAINT') {
      return res.status(409).json({ message: '這個帳號已經被使用' });
    }
    return res.status(500).json({ message: '資料庫錯誤' });
  }
  res.status(201).json({ id: this.lastID, username });
});

用Thunder Client測試註冊後,查詢資料庫會看到這樣的結果:

{ id: 1, username: 'amy', password_hash: '$2b$10$Tth4FAeq...' }

觀察

  • 註冊成功的回應只有id和username,不回傳任何跟密碼有關的欄位
  • 重複註冊同一個帳號會收到409。這個判斷是靠資料表的UNIQUE限制,由資料庫擋下來,程式只是接住錯誤再轉成好懂的訊息
  • 雜湊是單向的,沒辦法從$2b$10$... 反推原本的密碼

卡關
註冊完之後,我不知道資料存在哪裡、要怎麼看。查到資料之後又誤把那串password_hash當成測試登入時要輸入的密碼,才搞清楚兩個方向不一樣:註冊是把密碼雜湊後存起來,登入是把輸入的密碼雜湊後去比對,測試時要輸入的永遠是原本的密碼。

心得
看到資料庫裡只有一串亂碼,才真正理解為什麼說連開發者都不應該知道使用者的密碼。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言