打造區塊鏈應用的安全性:第 2 篇 – 使用立即可用的解決方案實現快速部署
資料提供者:DigiKey 北美編輯群
2019-10-15
編者說明:區塊鏈技術及其交易方法的細節非常複雜。本系列文章共有兩篇,第一篇簡要介紹區塊鏈的結構及其交易過程。該部分將提供相關的背景知識,幫助您瞭解為何私鑰保護是區塊鏈安全的核心所在,然後會介紹一個立即可用的私鑰保護解決方案。本文為第二篇,介紹開發人員如何使用此立即可用的硬體式解決方案,更輕鬆地保護區塊鏈交易。
區塊鏈技術常用於加密虛擬貨幣,但除此之外,還可為開發人員提供具有廣泛適用性的安全基礎設施。此技術採用去中心化架構,消除了對中央式授權的需求。其依賴私鑰和加密方法來保護資產以及資產在各方之間的交換。因此,區塊鏈系統的安全性主要取決於金鑰的安全性,以及金鑰在演算法中是否正確使用。
雖然市面上已有合適的演算法可用,但在實作時需要大量的專業技術和經驗,方能開發出安全的解決方案,並將其整合至目標應用中。如果沒有合適的工具將區塊鏈構建到應用的核心,開發人員將會發現自己難以推進工作,甚至容易受到網路黑盜的攻擊。
本文介紹了 Infineon Technologies 立即可用的硬體式區塊鏈安全解決方案,能如何讓開發人員更輕鬆地保護區塊鏈交易。
私鑰安全性
區塊鏈不需要中央授權來核准交易。這項技術仰賴共識機制來維護區塊鏈的完整性,同時區塊鏈透過一組使用加密技術和私鑰/公鑰對簽署和驗證的交易不斷進行擴展。實際上,私鑰在區塊鏈系統中充當著所有權憑證的角色。私鑰因意外事件或盜竊而造成的遺失或暴露,已經導致重大的加密虛擬貨幣損失。因此,私鑰的安全性是部署區塊鏈應用的重中之重。
早期的方法以軟體或有限的硬體安全性作為基礎,私鑰容易受到各種攻擊。相比之下,更健全的解決方案則是建立在安全控制器上,能為各種直接和間接的威脅提供深度保護。Infineon Blockchain Security 2Go 入門套件 (BLOCKCHAINSTARTKITTOBO1) 採用了以這種安全控制器為基礎的解決方案,可提供區塊鏈安全性所需的深度保護。
開發人員可為使用者提供非接觸式智慧卡,而不必克服挑戰去實作自己的解決方案。這些卡片內置有區塊鏈安全機制,如交易簽章,而這是擴展區塊鏈的第一個關鍵步驟 (圖 1)。
圖 1:Infineon Blockchain Security 2Go 智慧卡內置有區塊鏈機制,包括用於擴展區塊鏈的交易簽章,簡化了區塊鏈安全性的部署。(圖片來源:Infineon Technologies)
安全平台
在購買安全元件時,區塊鏈系統整合商通常都需要簽署保密協議,但 Infineon Blockchain Security 2Go 入門套件為其提供了立即可用的安全解決方案,消除了這一需求。
該套件含有五張智慧卡,能實作關鍵的區塊鏈機制,包括安全金鑰生成、簽章製作以及 PIN 身份驗證等,其設計理念是使用 Infineon 的開源軟體實現快速部署。此外,開發人員也可從相關的 Infineon Security 2Go 10 卡包 (BLOCKCHAIN10CARDSTOBO1) 取得這些智慧卡。
這些卡片符合 ISO/IEC 7810 ID-1 標準。在某些地區,此標準適用於常規的支付卡和身份證。在連接性方面,這些智慧卡整合了 ISO/IEC 14443 標準所定義的 1 類天線,而這種標準適用於採用近場通訊 (NFC) 的非接觸式卡。
每張卡片均嵌有安全控制器。這些控制器提供了硬體式安全性,可用於建立和儲存多達 255 個私鑰/公鑰對並執行加密演算法。除了整合真實亂數產生器 (TRNG) 之外,這些卡片還支援兩種加密技術的演算法:一是使用 256 位元先進加密標準 (AES) 的對稱加密;一是使用 256 位元橢圓曲線加密 (ECC) 並且預先載入 secp256k1 ECC 曲線的非對稱加密,這種曲線通常用於比特幣和以太坊等加密虛擬貨幣。
由於能專業支援區塊鏈安全機制,這些卡片為保護區塊鏈交易提供了立即可用的解決方案。區塊鏈系統整合商不需要花時間來建立安全的簽章方法,他們只需要將這些智慧卡交給使用者,讓其在與部署的區塊鏈系統互動時使用即可。
互動更簡單
對於使用者而言,智慧卡不僅能提供簡單的方法來執行區塊鏈交易,還能充分保護其私鑰。這些卡片需要和在介面元件 (如 NFC 智慧型手機,或配備獨立 NFC 智慧卡讀卡器的電腦) 上執行的軟體一起使用。在執行區塊鏈應用程式時,使用者將卡片放在介面元件上,即可啟動卡片的功能 (圖 2)。
圖 2:如圖所示,使用者將智慧卡靠近 NFC 讀卡器天線 (例如 Google Pixel 智慧型手機背面的光澤區域),即可啟動智慧卡的功能。(圖片來源:Infineon Technologies)
為了能即時評估 Security 2Go 智慧卡,Infineon 提供了一個 Android 行動應用程式,以展示其在典型情境下的應用。當在支援 NFC 功能的智慧型手機上啟動後,此行動應用程式會請使用者將卡片放在智慧型手機的 NFC 天線區域,啟動完整的行動應用程式介面 (圖 3)。
圖 3:Coinfinity GmbH 為 Blockchain Security 2Go 入門套件,開發了一個預建的 Android 應用程式。此程式顯示了當卡片請求與智慧卡接觸後 (左),如何使用智慧卡功能來展示不同的使用場景 (右)。(圖片來源:Infineon Technologies)
在智慧型手機或其他介面元件上執行的軟體,會在此行動應用程式和其他部署的幕後,發出指令來執行各種功能,例如產生新的金鑰對,或取得現有金鑰對的相關資訊等。在這些及其他指令序列中,私鑰永遠不會離開智慧卡。在回應涉及私鑰的指令時,智慧卡最多會向介面元件傳回一個金鑰控制代碼。而介面元件軟體則會使用此控制代碼執行相關指令,例如擷取與某特定私鑰配對的公鑰 (圖 4)。
使用這種方法,在介面上執行的軟體能充分完成與區塊鏈系統互動所需進行的操作,而且不會損害機密資料。
圖 4:智慧型手機或智慧卡讀卡器等介面元件,向 Infineon Blockchain Security 2Go 智慧卡發出指令,例如請求生成此金鑰,該智慧卡將會建立私鑰/公鑰對並傳回公鑰,而不會洩露私鑰。(圖片來源:Infineon Technologies)
介面元件軟體依然負責執行特定於應用程式的功能,例如將公鑰轉換為每個交易所使用的區塊鏈地址 (通常是唯一的地址)。舉個例子,比特幣地址將使用公鑰作為單向雜湊演算法的輸入,該演算法會產生一個依賴該公鑰但不能用於重新建立該公鑰的地址。
同樣,若想簽署交易請求,該介面會向智慧卡發出指令和附帶的雜湊結果。作為回應,智慧卡將簽章傳回介面元件 (圖 5)。
圖 5:簽署交易需要使用私鑰,但有了 Infineon Blockchain Security 2Go 智慧卡,介面元件可以接收簽章,而不會暴露極具重要性的私鑰。(圖片來源:Infineon)
應用協定資料單元
對於每個指令和回應,介面元件會使用 ISO/IEC 7816 標準第 4 部分所定義的應用協定資料單元 (APDU),與智慧卡進行互動。每次與智慧卡互動時,介面元件都會以 ISO/IEC-7816 標準的指令 APDU 格式來發送服務請求,並以標準的回應 APDU 格式接收 (選擇性) 回應 (圖 6)。
圖 6:ISO/IEC 7816 標準的指令 APDU 及回應 APDU 格式,構成了介面元件與相容智慧卡 (例如 Infineon Blockchain Security 2Go 智慧卡) 通訊的基礎。(圖片來源:Infineon Technologies)
在指令 APDU 中,智慧卡供應商會根據目標應用領域所用的業界標準定義受支援的指令和參數。Infineon 針對其 Blockchain Security 2Go 智慧卡定義了一組核心指令,可充分利用智慧卡的功能 (表 1)。
表 1:Infineon Blockchain Security 2Go 智慧卡的指令集。(表格來源:由 DigiKey 根據 Infineon Technologies 資料製作)
例如,要啟動新的工作階段,介面元件軟體會使用 Infineon 為 Blockchain Security 2Go 入門套件提供的固定應用識別碼 (AID) 的資料值,來構建 SELECT APPLICATION 這個指令 APDU。在收到此指令 APDU 之後,智慧卡會進行初始化,建立新的工作階段,並傳送相應的回應 APDU,其中會包含一些智慧卡中繼資料 (圖 7)。
圖 7:Infineon 會為 Blockchain Security 2Go 智慧卡提供指令所需以及會在回應和錯誤代碼中出現的特定 APDU 欄位值,例如這組用於初始化智慧卡的欄位值,其中就包含了 Infineon 提供的固定應用識別碼 (AID)。(圖片來源:Infineon Technologies)
客製化軟體
在使用 Blockchain Security 2Go 智慧卡建立新的應用程式時,開發人員不需要在這麼低的層級作業。在 Blockchain Security 2Go GitHub 儲存庫中,Infineon 提供了有關智慧卡使用的範例應用程式和文件。
Infineon 在 BlockchainSecurity2Go Android 原始程式碼 GitHub 儲存庫中,為其 Android 行動應用程式提供了完整的 Java 原始程式碼。透過探索此程式碼庫,軟體程式設計師可以快速學習關鍵的設計模式,如初始化智慧卡工作階段 (selectApplication()
)、從智慧卡讀取公鑰 (readPublicKeyFromCard()
),以及在卡片尚無公鑰時,建立新的金鑰對 (generateNewSecp256K1Keypair()
) 等 (清單 1)。
複製
/**
* Read public key from card, or create a new one if it doesn't exist yet. *
* @param card nfc card
* @return public key as hexadecimal String
* @throws IOException on communication errors
* @throws NfcCardException when card returns something other than 0x9000 or 0x61XX
*/
public static GetKeyInfoResponseApdu readPublicKeyOrCreateIfNotExists(NfcTranceiver card, int keyIndex)
throws IOException, NfcCardException {
try {
selectApplication(card);
// try to read public key
return readPublicKeyFromCard(card, keyIndex);
} catch (NfcCardException e) {
// if Public key is not available yet (Status words: 0x6A88)
if (e.getSw1Sw2() == SW_KEY_WITH_IDX_NOT_AVAILABLE) {
int newKeyIndex;
do {
// create a new keypair
newKeyIndex = generateNewSecp256K1Keypair(card);
} while (newKeyIndex <= keyIndex);
// and ask for the pubkey of the newly created keypair
return readPublicKeyFromCard(card, newKeyIndex);
} else {
// throw all other exceptions to our caller
throw e;
}
}
}
清單 1:Infineon 為其 Blockchain Security 2Go Android 應用程式提供了完整的原始程式碼,該程式碼展示了基本的互動操作,例如讀取公鑰或建立新的私鑰/公鑰對等。(原始程式碼:Infineon Technologies)
Java 程式碼庫中的公用程式類別實作了詳細的互動,例如建立 SELECT APPLICATION APDU。調用成員函數 (如以下清單 2 所示) 的常式會傳遞含有 Infineon Blockchain Security 2Go AID 的 aid
參數,而該 AID 已在軟體包的前面聲明如下:
複製
public static final byte[] AID_INFINEON_BLOCKCHAIN2GO = fromHexString("D2760000041502000100000001");
public class SelectApplicationApdu extends BaseCommandApdu {
/**
* Instruction byte for SELECT APPLICATION operation. */
private static final int INS_SELECT_APPLICATION = 0xA4;
/**
* Constructs a SELECT APPLICATION command apdu. */
public SelectApplicationApdu(byte[] aid) {
this.ins = INS_SELECT_APPLICATION;
this.p1 = 0x04;
this.setData(aid);
this.leIncluded = true;
}
}
清單 2:Infineon Blockchain Security 2Go Android 應用程式原始代碼發行版展示了如何建立指令 APDU,對智慧卡進行初始化。(原始程式碼:Infineon Technologies)
為了加快開發速度,Infineon 還提供了 Blockchain Security 2Go Python 函式庫,以及在此函式庫基礎上建立的命令列介面。與 Java 版本一樣,Python 程式碼展示了執行智慧卡操作 (例如產生金鑰對) 所需的簡單設計模式 (清單 3)。
複製
def select_app(reader):
""" Sends command to select the Blockchain Security2GO application
Needs to be called after reset to allow for access to
blockchain commands.
Returns:
:obj:`tuple`: (pin_active, card_id, version).
pin_active:
bool: True if PIN is set on the card
card_id:
bytes: 10 byte unique card identifier
version:
str: card firmware version, following
semantic versioning.
Raises:
CardError: If card indicates a failure.
Any exceptions thrown by the reader wrapper are passed through. """
logger.debug('SELECT Blockchain Security 2Go starter kit')
aid = bytes.fromhex('D2760000041502000100000001')
r = reader.transceive(b'\x00\xA4\x04\x00', aid).check()
pin_active = True if r.resp[0] == 1 else False
card_id = r.resp[1:11]
version = r.resp[11:].decode('ASCII')
return (pin_active, card_id, version)
def generate_keypair(reader):
""" Sends command to generate new keypair
A new keypair is generated and stored.The ID identifying this
keypair is returned.A key using the `secp256k1`_ curve is generated.
Args:
reader (:obj:): object providing reader communication
Returns:
int: ID of the just generated keypair, to be used e.g. for
future signatures using ``generate_signature``
Raises:
CardError: If card indicates a failure, e.g. if card is full.
Any exceptions thrown by the reader wrapper are passed through.
.._secp256k1:
http://www.secg.org/sec2-v2.pdf
"""
logger.debug('GENERATE KEYPAIR')
r = reader.transceive(b'\x00\x02\x00\x00').check()
key_id = int(r.resp[0])
logger.debug('generated key %d', key_id)
return key_id
清單 3:Infineon Blockchain Security 2Go Python 函式庫和隨附的命令列介面,可透過全套服務常式幫助加快開發速度,例如用於初始化 Blockchain Security 2Go 智慧卡的 select_app()
函數,以及 generate_keypair()
等,這兩個函數都展示了智慧卡互動的基本設計模式。(原始程式碼:Infineon Technologies)
Blockchain Security 2Go Python 函式庫採用典型的 Python 風格,建置於現成的第三方模組上。尤其是,Infineon 函式庫使用熱門的 pyscard 模組,將其函數封裝在自己的類別定義中。例如,Blockchain Security 2Go Python 函式庫會透過查找個人電腦/智慧卡 (PC/SC) 讀取器來啟動智慧卡工作階段。對於 Blockchain Security 2Go Python 函式庫的主要 blocksec2go
模組,此探索將使用 open_psycard()
函數進行。此函數是函式庫類別中封裝 pyscard 函數的成員函數 (清單 4)。
複製
class PySCardReader:
""" Wrapper to use PyScard with blocksec2go
Abstracts communication into a simple function
"""
def __init__(self, connection):
self.connection = connection
self.connection.connect()
def transceive(self, header, data = b'', le = -1):
apdu = Apdu(header, data, le)
logger.debug(apdu)
resp = self._transceive(bytes(apdu))
logger.debug(resp)
return resp
def _transceive(self, data):
resp, sw1, sw2 = self.connection.transmit(array.array('b', data).tolist())
return ApduResponse(array.array('B', resp).tobytes(), (sw1 << 8) + sw2)
清單 4:Infineon Blockchain Security 2Go Python 函式庫使用成員函數來調用 pyscard 函數,來封裝與此類別中的第三方 pyscard 模組之間的互動。(原始程式碼:Infineon Technologies)
結論
區塊鏈技術提供了擴展資訊取得性的框架,而不會損害資訊的完整性或真實性。區塊鏈系統不倚賴中央授權,而是使用加密來驗證交易並保護交易不被修改。這種方法的關鍵要素是,私鑰需要有強大的安全機制,才能避免失去對使用者交易的控制權並防止區塊鏈系統受到破壞。
如文中所述,Infineon Blockchain Security 2Go 入門套件及隨附的開源軟體,為區塊鏈系統整合商提供了立即可用的安全解決方案,亦為使用者提供了更簡單、更安全的區塊鏈交易執行方法。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。