ブロックチェーンアプリケーションでセキュリティを構築する:パート2 – ターンキーソリューションによる迅速な展開
DigiKeyの北米担当編集者の提供
2019-10-15
編集者メモ:ブロックチェーン技術とそのトランザクション方式の詳細は複雑です。本シリーズは2パート構成であり、パート1では、ブロックチェーンの構造とトランザクションプロセスの概要について説明しています。この説明を通じて、ブロックチェーンのセキュリティの中核が秘密キーの保護である理由を理解する準備ができます。また、秘密キーを保護するためのターンキーソリューションについても紹介しています。このパート2では、ハードウェアベースのソリューションであるこのターンキーを使用して、ブロックチェーントランザクションをより簡単に保護する方法について説明します。
ブロックチェーン技術は、暗号通貨でよく使用されるほか、広範な用途のセキュアインフラを実現できます。ブロックチェーンは分散アーキテクチャであり、資産や関係者どうしによる資産の交換を保護するために秘密キーと暗号化方式が利用されています。一元化された権限は必要ありません。そのため、ブロックチェーンシステムの安全性を確保できるかどうかは、キーの保護と、堅牢なアルゴリズムでそれらのキーが適切に使用されるかどうかに大きく依存します。
すぐに利用できる適切なアルゴリズムは複数ありますが、実装には、セキュアソリューションの開発と、対象のアプリケーションに開発したソリューションを統合するための豊富な専門知識と経験が必要です。ブロックチェーンをアプリケーションの中核に組み込むための適切なツールがないと、開発者の作業が行き詰まる場合があり、サイバー犯罪に対して脆弱になる可能性すらあります。
この記事では、Infineon Technologiesから提供されている、ブロックチェーンのセキュリティを対象としたハードウェアベースのソリューションであるターンキーを使用して、ブロックチェーントランザクションをより簡単に保護する方法について説明します。
秘密キーのセキュリティ
ブロックチェーンでは、トランザクションを承認するための一元化された権限が不要です。代わりに、合意メカニズムを利用して、暗号化および秘密キーと公開キーのペアで署名、検証される一連のトランザクションで拡大し続けるブロックチェーンの完全性を維持します。実際、秘密キーはブロックチェーンシステムにおける所有権の資格情報として機能します。この情報が誤ってまたは盗難で失われたり漏洩したりすることで、すでに多額の暗号通貨の損失が生じています。そのため、秘密キーのセキュリティは、ブロックチェーンアプリケーションの展開における最重要項目となっています。
ソフトウェアセキュリティまたは限定されたハードウェアセキュリティに基づく従来のアプローチでは、秘密キーがさまざまな攻撃に対して脆弱なままになることがあります。これに対して、多様な直接的および間接的脅威からの強固な保護を目的として設計されたセキュリティコントローラをベースにしてより堅牢なソリューションが構築されています。Infineon Blockchain Security 2Goスターターキット(BLOCKCHAINSTARTKITTOBO1)は、このようなセキュリティコントローラをベースにしたソリューションを使用して、ブロックチェーンのセキュリティに必要となる強固な保護を実現します。
開発者は、独自のソリューションを実装するという課題に対処するのではなく、ブロックチェーンのセキュリティメカニズムの組み込みサポートを備えた非接触スマートカードをユーザーに提供できます。このメカニズムには、ブロックチェーンを拡大するうえで重要な第一歩となるトランザクションの署名が含まれます(図1)。
図1:Infineon Blockchain Security 2Goスマートカードでは、ブロックチェーンの拡大に使用されるトランザクションの署名を含むブロックチェーンメカニズムの組み込みサポートを利用して、ブロックチェーンのセキュリティを簡単に展開できます。(画像提供:Infineon Technologies)
セキュアなプラットフォーム
Infineon Blockchain Security 2Goスターターキットは、ブロックチェーンシステムインテグレータに、セキュリティデバイスを入手する際に通常必要となる秘密保持契約書が不要になるターンキーセキュリティソリューションを提供します。
Infineonが提供するオープンソースソフトウェアを使用した迅速な展開用に設計されたこのキットには、セキュアキーの生成、署名の作成、およびPINの認証を含む主要なブロックチェーンメカニズムを実装する5枚のスマートカードが含まれています。関連するInfineon Security 2Go 10カードパッケージ(BLOCKCHAIN10CARDSTOBO1)では、これらのスマートカードが増量されています。
カードは、一部の地域で従来の支払いカードやIDカードに使用されるISO/IEC 7810 ID-1規格に準拠しています。接続のために、スマートカードには、近距離無線通信(NFC)を使用する非接触カード向けのISO/IEC 14443に基づくクラス1アンテナが内蔵されています。
各カードにはセキュリティコントローラが組み込まれており、最大255個の秘密キーと公開キーのペアを作成して保存し、暗号化アルゴリズムを実行するハードウェアベースのセキュリティを提供します。カードでは、内蔵されている真の乱数発生器(TRNG)に加えて、256ビットの高度暗号化標準(AES)を使用した対称暗号化と256ビットの楕円曲線暗号化(ECC)を使用した非対称暗号化の両方のアルゴリズムがサポートされ、一般にビットコインやイーサリアムなどの暗号通貨で使用される256k1 ECC曲線がプリロードされています。
カードはブロックチェーンのセキュリティメカニズムに特化したサポートを提供することで、ブロックチェーントランザクションを保護する直接的なソリューションを実現します。ブロックチェーンシステムインテグレータは、安全な署名方式の作成に時間を費やすことなく、展開済みのブロックチェーンシステムとやり取りする際に使用するスマートカードをユーザーに手渡すだけで済みます。
やり取りの簡略化
スマートカードを使用すると、ユーザーは、秘密キーを完全に保護しながらブロックチェーントランザクションを簡単に実行できます。カードは、NFCスマートフォンやスタンドアロンのNFCスマートカードリーダを備えたコンピュータなどのインターフェースデバイスで実行されるソフトウェアと連携して動作するように設計されています。ブロックチェーンアプリケーションの実行中に、ユーザーはインターフェースデバイスにカードをかざしてカードの機能をアクティブにします(図2)。
図2:ユーザーは、ここで示すように、Google Pixelスマートフォンの背面にある光沢面などのNFCリーダアンテナにスマートカードをかざしてその機能を起動します。(画像提供: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スマートカードのコマンドセット。(表提供:Infineon TechnologiesのデータからDigiKeyが作成)
たとえば、新しいセッションを開始するには、インターフェースデバイスのソフトウェアは、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)。
コピー
/**
* 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パラメータを渡します。
コピー
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ライブラリとこのライブラリをベースに構築されたコマンドラインインターフェースも提供しています。このPythonコードは、Javaバージョンと同様に、キーペアの生成などのスマートカード操作の実行に必要となる簡単な設計パターンをデモンストレーションしています(リスト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ライブラリは、特有のPythonic形式で、すぐに利用できるサードパーティモジュールに基づいて構築されています。特に、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の公式な方針を必ずしも反映するものではありません。

