發布日期:2022-04-17 點擊率:92
編者按:區塊鏈技術及其交易方法的細節非常復雜。本系列文章包括兩部分,第 1 部分概述了區塊鏈結構及其交易過程。這提供了一個背景,幫助您了解為什么說保護私鑰是區塊鏈安全的核心所在,進而介紹一個用于保護私鑰的交鑰匙型解決方案。本文,即第 2 部分,將向開發人員展示如何使用這一基于硬件的交鑰匙型解決方案更輕松地保護區塊鏈交易。
除了其在加密貨幣中的常見用途外,區塊鏈技術還可以為開發人員提供具有廣泛適用性的安全基礎架構。它的去中心化架構消除了對中央管理機構的需求,轉而依靠私鑰和加密方法來保護資產及其在各方之間的交換。因此,區塊鏈系統的安全性關鍵取決于密鑰的安全性以及它們在穩健算法中的正確使用。
盡管有現成的合適算法,但是實現需要大量的專業知識和經驗,這樣才能開發出安全的解決方案并將其整合到目標應用中。如果沒有合適的工具將區塊鏈構建到應用的核心中,開發人員就會發現他們的工作停滯不前,甚至容易受到網絡竊賊的攻擊。
本文向開發人員展示如何使用 Infineon Technologies 提供的基于硬件的交鑰匙型區塊鏈安全解決方案,以更輕松地方式保護區塊鏈交易。
區塊鏈消除了要有中央管理機構批準交易的需要。取而代之的是,這項技術依靠共識機制來維持區塊鏈的完整性,而區塊鏈則通過使用加密方法和私鑰/公鑰對進行簽名和驗證的一組交易來持續擴展。實際上,私鑰在區塊鏈系統中充當所有權憑據。因意外或盜竊而造成的私鑰丟失或暴露已經造成了重大的加密貨幣損失。因此,私鑰的安全性是部署區塊鏈應用時最重要的問題。
早期基于軟件或有限硬件安全性的方法可能會使私鑰容易受到各種攻擊。相比之下,更強大的解決方案構建于可針對各種直接和間接威脅提供深度保護的安全控制器之上。Infineon Blockchain Security 2Go 入門套件 (BLOCKCHAINSTARTKITTOBO1) 使用基于此類安全控制器的解決方案,提供了區塊鏈安全所需的深度保護。
開發人員無需再面對實現自有解決方案的挑戰,而是可以為用戶提供內置區塊鏈安全機制支持的非接觸式智能卡,包括支持交易簽名,這是擴展區塊鏈的關鍵第一步(圖 1)。
圖 1:Infineon Blockchain Security 2Go 智能卡通過對區塊鏈機制(包括用于擴展區塊鏈的簽名交易)的內置支持,簡化了區塊鏈安全的部署。(圖片來源:Infineon Technologies)
Infineon Blockchain Security 2Go 入門套件為區塊鏈系統集成商提供了一個交鑰匙型的安全解決方案,且不需要獲取安全設備通常所需的保密協議。
該套件旨在使用 Infineon 提供的開源軟件進行快速部署,包括五張智能卡,可實現包括生成安全密鑰、創建簽名和 PIN 身份驗證在內的關鍵區塊鏈機制。此外,開發人員還可從相關的 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 智能卡的命令集。(表來源:由 Digi-Key Electronics 根據 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 智能卡創建新應用時,開發人員無需在此底層工作。Infineon 在其 Blockchain Security 2Go GitHub 知識庫中提供了有關智能卡使用的樣例應用和文檔。
Infineon 在其 BlockchainSecurity2Go Android 代碼 GitHub 知識庫中包含了用于其 Android 移動應用的完整 Java 源代碼。通過研究該代碼庫,軟件程序員可以快速學習關鍵設計模式,包括初始化智能卡會話 (selectApplication()
),從智能卡讀取公鑰 (readPublicKeyFromCard()
),以及在卡上尚不存在公鑰的情況下新建密鑰對 (generateNewSecp256K1Keypair()
)(清單 1)。
副本 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(如下)中所示成員函數的例程會傳遞一個 aid
參數,其中保存了 Infineon Blockchain Security 2Go AID,該參數在數據包中前面的聲明如下:
副本 public static final byte[] AID_INFINEON_BLOCKCHAIN2GO = fromHexString("D2760000041502000100000001"); public class SelectApplicationApdu extends baseCommandApdu { private static final int INS_SELECT_APPLICATION = 0xA4; 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'x00xA4x04x00', 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'x00x02x00x00').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 入門套件及其隨附的開源軟件為區塊鏈系統集成商提供了一種即時安全的解決方案,并為用戶提供了一種更簡單、更安全的方法執行區塊鏈交易。
下一篇: PLC、DCS、FCS三大控
上一篇: 射頻定向耦合器的基本