在一些安全性比較低的門禁系統中,有時候只會讀取 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,atqa
是 0400
,sak
是 08
,通常沒有 ats
資料。其中 atqa
的原始資料是 Little Endian 格式,有的 GUI 會幫你轉換成 Big Endian 格式,所以 atqa
就會顯示成 0004
。
這類只讀取卡號的系統其實非常不安全,因為任何讀卡機都能讀到卡號,也有很多系統會把卡號當作公開資料對待,例如:去 7-11 儲值悠遊卡,收據上會直接把卡號印出來。
甚至有的卡片也會直接把卡號印在卡片上面,只要被有心人士猜出卡號的規則,就有可能被拷貝!