778 字
4 分鐘
[HiPKI Local Server] /p11Image.bmp 解碼圖片取得讀卡機 | 深入淺出自然人憑證
2023-12-31
無標籤

首頁 > 系列文 > 自然人憑證開發筆記

在開始開發簽章、加密之前,有個功能更重要,需要知道使用者是否插卡,或是需要選擇讀卡機,從上一篇可以知道,網站要能夠使用自然人憑證,需要透過 JavaScript 與本地的 HiPKI Local Server (localhost:61161)溝通。本篇會說明如何檢查使用者是否已經插入自然人憑證到電腦上。


p11Image.bmp 介紹#

HiPKI Local Server 提供一個路徑 http://localhost:61161/p11Image.bmp,讓開發者可以取得讀卡機、卡片的清單。這時候你可能會好奇,bmp不是圖片嗎?打開該路徑什麼也看到不到。看不到是正常的,因為這裡使用圖像隱寫術,需要經過特定的演算法,才能將圖片轉為文字,並取得讀卡機與卡片的資訊。

因此,我們需要在前端存取上述路徑,載入圖片,並進行演算,把圖片轉換成 JSON 格式。至於為什麼要做多此一舉的事,怎麼不提供 JSON API 就好,我猜可能是為了解決跨域存取問題,這種作法我也是第一次遇到。在開始講範例程式之前,先解釋一下他的隱寫術機制。


p11Image.bmp 圖像隱寫術機制#

p11Image.bmp 是一張高度只有 1px 的圖片,所有資訊都往寬度塞,儲存資料的原理是將文字的 ASCII Code 存在 RGB 中,再把他讀出來,如下圖所示。

分成三個步驟將圖片轉為文字資訊:

步驟一、讀取每格像素的三原色(RGB),數字介於0–255

每格像素是一個顏色,而可以將這個顏色轉為三原色表示法,代表這顏色可以透過紅色、綠色、藍色來混合出來,CSS 中的顏色也是透過此方法,更多資料參考網頁顏色說明。

步驟二、依 BGR 順序將數字排序

這裡演算法設計是依照 BGR (藍綠紅)順序來排列,將三個數字排成一行。

步驟三、將數字透過 ASCII 轉為文字,串成字串

將這些數字每個透過 ASCII 轉為文字,例如 65 是 A、66 是 B,並串成字串,這樣就完成了。從上圖我們拿到 ABCDEFGHI 為結果。


p11Image.bmp 內容#

透過上述演算法,我們將圖片轉為文字,該文字為 JSON 檔,範例格式如下,比較重要的是以下幾個欄位:

  • slots:讀卡機清單
  • slotDescription:讀卡機名稱
  • serialNumber:卡號
{
"cryptokiVersion":2.04,
"flags":0,
"func":"pkcs11info",
"last_error":0,
"libraryDescription":"CHT PKCS#11 3.1.0.00009",
"libraryVersion":3.003,
"manufacturerID":"Chunghwa TeleComm TL",
"ret_code":0,
"slots":[
{
"firmwareVersion":0,
"flags":7,
"hardwareVersion":0,
"manufacturerID":"unKnow",
"slotDescription":"InfoThink USB Reader",
"slotID":0,
"token":{
"firmwareVersion":1,
"flags":1037,
"hardwareVersion":1,
"label":"HiCOS PKI Smart Card",
"manufacturerID":"Chunghwa TeleCom Co., Ltd.",
"model":"T7S\u0003",
"serialNumber":"TP03200300000000",
"ulFreePrivateMemory":4294967295,
"ulFreePublicMemory":4294967295,
"ulMaxPinLen":8,
"ulMaxRwSessionCount":0,
"ulMaxSessionCount":0,
"ulMinPinLen":6,
"ulSessionCount":0,
"ulTotalPrivateMemory":4294967295,
"ulTotalPublicMemory":4294967295,
"utcTime":""
}
}
],
"version":"2.3.3",
"serverVersion":"1.3.5.1",
"installedModule":[
{
"version":"1.1.9",
"description":"CardManagement"
},
{
"version":"1.3.5.1",
"description":"HiPKILocalSignServer"
}
]
}

結語#

會知道透過這種機制取得讀卡機資訊,是看內政部範例網站行動自然人憑證網站的 JavaScript 得知,大家也可以去研究。下一篇就來講 JavaScript 要怎麼寫。

▶ 閱讀更多:深入淺出自然人憑證