iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0

Day 13 透過 JS SDK 讀取 RFID 卡號

在一些安全性比較低的門禁系統中,有時候只會讀取 RFID 卡片的卡號,然後根據卡號來決定是否開啟門禁,所以我們就來嘗試使用變色龍讀取卡號吧。

首先,請在變色龍正面放一張高頻卡:

然後在 Console 內輸入以下程式碼:

// 在測試網頁的開發者工具中執行 https://taichunmin.idv.tw/chameleon-ultra.js/test.html
await (async ultra => {
  // 掃描並回傳卡片的資訊: uid, atqa, sak, ats
  // 一次可能會回傳多張卡片,所以只取陣列的第一筆資料
  // _.first 是 lodash 的函式,可以取得陣列的第一筆資料
  const antiColl = _.first(await ultra.cmdHf14aScan())
  // 由於回傳的資料都是 Buffer (二進位資料),所以需要轉成 hex 格式顯示
  // _.mapValues 是 lodash 的函式,可以將物件的值轉換成新的值
  console.log(_.mapValues(antiColl, val => val.toString('hex')))
})(vm.ultra) // vm.ultra 是測試網頁提供的全域變數,會根據所選擇的連線方式來切換不同的 ultra 物件實例 (instance)

如果你還沒有跟變色龍裝置連線過,瀏覽器會請你選擇你的裝置如下:

選擇裝置之後,程式就會開始嘗試讀取卡號,如果讀取成功的話,你應該會看到類似以下的訊息:

{
  "uid": "136d4a3d",
  "atqa": "0400",
  "sak": "08",
  "ats": ""
}

卡片的讀取結果中,uid 就是這張卡片的卡號;atqa 以及 sak 分別是「Answer To reQuest code A」及「Select AcKnowledge」的縮寫,是讀卡機在執行防碰撞 (Anti-Collision) 及選擇卡片過程中的卡片回應資料,可以用來初步判斷卡片的種類;ats 是「Answer To Select」的縮寫,這個資料通常會被用來進一步判斷卡片的種類。

以最常見的 M1 (4 bytes UID) 卡片為例,uid 總共有 4 Bytes,atqa0400sak08,通常沒有 ats 資料。其中 atqa 的原始資料是 Little Endian 格式,有的 GUI 會幫你轉換成 Big Endian 格式,所以 atqa 就會顯示成 0004

門禁系統只讀卡號安全嗎?

這類只讀取卡號的系統其實非常不安全,因為任何讀卡機都能讀到卡號,也有很多系統會把卡號當作公開資料對待,例如:去 7-11 儲值悠遊卡,收據上會直接把卡號印出來。

甚至有的卡片也會直接把卡號印在卡片上面,只要被有心人士猜出卡號的規則,就有可能被拷貝!


上一篇
Day 12 準備 JS SDK 的 Playground
系列文
免安裝!一起用 JS 來控制開源的 NFC 讀卡機變色龍吧!13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言