Einbauen von Sicherheit in Blockchain-Anwendungen: Teil 2 – Schnelle Bereitstellung mit einer schlüsselfertigen Lösung
Zur Verfügung gestellt von Nordamerikanische Fachredakteure von DigiKey
2019-10-15
Anmerkung des Herausgebers: Die Blockchain-Technologie und ihre Transaktionsverfahren sind ein äußerst komplexes Thema. Teil 1 dieser zweiteiligen Reihe bietet einen Überblick über den Aufbau der Blockchain-Technik und ihren Transaktionsprozess. Aus den Erläuterungen geht hervor, warum der Schutz privater Schlüssel von zentraler Bedeutung für die Sicherheit von Blockchains ist; gleichzeitig bilden sie die Überleitung zur Einführung einer schlüsselfertigen Lösung für die Sicherung privater Schlüssel. In Teil 2 wird erläutert, wie Entwickler Blockchain-Transaktionen mithilfe dieser schlüsselfertigen, hardwarebasierten Lösung einfacher schützen können.
Über ihre etablierte Verwendung für Kryptowährungen hinaus kann die Blockchain-Technologie Entwicklern eine sichere Infrastruktur mit einem breiten Anwendungsspektrum bieten. Ihre dezentrale Architektur macht eine zentrale Instanz überflüssig, weil sie auf private Schlüssel und Kryptografieverfahren setzt, um Vermögenswerte und deren Austausch unter Parteien zu schützen. Dementsprechend hängt die Sicherheit eines Blockchain-Systems auch ganz entscheidend von der Sicherheit der Schlüssel und ihrer ordnungsgemäßen Verwendung in robusten Algorithmen ab.
Zwar sind entsprechende Algorithmen verfügbar, doch die Implementierung erfordert ein erhebliches Maß an Wissen und Erfahrung, um eine sichere Lösung zu erarbeiten und diese in die Zielanwendung einzubinden. Ohne die richtigen Werkzeuge für die Integration von Blockchain in den Kern einer Anwendung, kann es passieren, dass die Anwendungsentwicklung ins Stocken gerät oder die Anwendung sogar für Cyber-Attacken anfällig ist.
Dieser Artikel beschreibt, wie Entwickler Blockchain-Transaktionen mit einer von Infineon Technologies stammenden schlüsselfertigen, hardwarebasierten Lösung für die Blockchain-Sicherheit einfacher schützen können.
Sicherheit privater Schlüssel
Blockchains machen eine zentrale Instanz für die Genehmigung von Transaktionen überflüssig. Stattdessen basiert diese Technologie auf Konsensmechanismen zur Wahrung der Integrität einer Blockchain, die kontinuierlich um weitere Transaktionen erweitert wird, die mittels Kryptografie und einem privaten/öffentlichen Schlüsselpaar signiert und verifiziert wurden. In der Tat dienen in Blockchain-Systemen private Schlüssel als Besitzberechtigungsnachweis. Ihr Verlust oder ihre Offenlegung durch Missgeschick oder Diebstahl hat bereits zu erheblichen Verlusten an Kryptowährung geführt. Deshalb ist die Sicherheit privater Schlüssel bei der Bereitstellung von Blockchain-Anwendungen von größter Bedeutung.
Bei älteren Ansätzen, die auf Software- oder eingeschränkter Hardware-Sicherheit basieren, sind private Schlüssel anfällig für eine Vielzahl von Angriffen. Robustere Lösungen basieren hingegen auf Sicherheitscontrollern, die einen umfassenden Schutz gegen diverse direkte und indirekte Bedrohungen bieten. Das Starterkit „Blockchain Security 2Go“ von Infineon (BLOCKCHAINSTARTKITTOBO1) nutzt eine solche Lösung und bietet den umfassenden Schutz, wie er für die Sicherheit von Blockchains benötigt wird.
Anstatt umständlich eine eigene Lösung zu implementieren, können Entwickler den Benutzern kontaktlose Smartcards mit integrierter Unterstützung für Blockchain-Sicherheitsmechanismen zur Verfügung stellen – einschließlich der Signierung von Transaktionen, dem entscheidenden ersten Schritt bei der Erweiterung einer Blockchain (Abbildung 1).
Abbildung 1: Die „Blockchain Security 2Go“-Smartcard von Infineon vereinfacht die Bereitstellung der Blockchain-Sicherheit mit integrierter Unterstützung für Blockchain-Mechanismen, einschließlich der Signierung von Transaktionen zur Erweiterung einer Blockchain. (Bildquelle: Infineon Technologies)
Sichere Plattform
Das Starterkit „Blockchain Security 2Go“ von Infineon bietet Blockchain-Systemintegratoren eine schlüsselfertige Sicherheitslösung, bei der die üblichen Geheimhaltungsvereinbarungen wie sonst beim Erwerb von Sicherheitsgeräten überflüssig sind.
Das Kit wurde für die schnelle Bereitstellung mittels Open-Source-Software von Infineon entwickelt und umfasst fünf Smartcards, die zentrale Blockchain-Mechanismen implementieren, darunter die sichere Erzeugung von Schlüsseln, die Erstellung von Signaturen und die PIN-Authentifizierung. Das zugehörige Kartenpaket „Security 2Go 10“ von Infineon (BLOCKCHAIN10CARDSTOBO1) bietet Entwicklern eine zusätzliche Quelle für diese Smartcards.
Die Karten erfüllen die Norm ISO/IEC 7810 ID-1, die in bestimmten Gegenden auch für herkömmliche Zahlungskarten und Ausweise verwendet wird. Für die Realisierung der Konnektivität verfügen die Smartcards über eine Antenne der Klasse 1 nach ISO/IEC 14443 für kontaktlose Karten, die mit NFC (Near Field Communication) arbeiten.
Ein in jede Karte integrierter Sicherheitscontroller bietet hardwarebasierte Sicherheit für die Erstellung und Speicherung von bis zu 255 privaten/öffentlichen Schlüsselpaaren sowie die Ausführung von Kryptografie-Algorithmen. Neben einem integrierten Zufallszahlengenerator (TRNG) unterstützen die Karten Algorithmen für die symmetrische Kryptografie mittels 256-Bit-AES (Advanced Encryption Standard) und asymmetrische Kryptografie mittels 256-Bit-ECC (Elliptic Curve Cryptography). Bereits geladen ist die ECC-Kurve secp256k1, wie sie normalerweise bei Kryptowährungen wie Bitcoin und Ethereum verwendet wird.
Mit ihrer speziellen Unterstützung für Blockchain-Sicherheitsmechanismen bieten die Karten eine schlüsselfertige Lösung für die Absicherung von Blockchain-Transaktionen. Anstatt Zeit in den Aufbau sicherer Signierungsverfahren zu investieren, können Blockchain-Systemintegratoren den Benutzern ganz einfach Smartcards zur Verwendung bei der Interaktion mit dem bereitgestellten Blockchain-System zur Verfügung stellen.
Einfachere Interaktionen
Benutzern bieten Smartcards ein einfaches Verfahren zum Ausführen von Blockchain-Transaktionen unter uneingeschränktem Schutz ihrer privaten Schlüssel. Die Karten sind auf die Zusammenarbeit mit Software ausgelegt, die auf einem Schnittstellengerät wie einem NFC-Smartphone oder einem Computer mit einem eigenständigen NFC-Smartcard-Leser ausgeführt wird. Bei der Ausführung ihrer Blockchain-Anwendung aktivieren die Benutzer die Kartenfunktionen, indem sie die Karte in das Schnittstellengerät einlegen (Abbildung 2).
Abbildung 2: Benutzer rufen die Smartcard-Funktionen auf, indem sie die Smartcard in die Nähe der Antenne des NFC-Lesers bringen, z. B. den glänzenden Bereich auf der Rückseite eines Google Pixel-Smartphones (siehe Abbildung). (Bildquelle: Infineon Technologies)
Zur sofortigen Evaluierung der Security 2Go-Smartcards stellt Infineon eine mobile Android-App zur Verfügung, die deren Verwendung in typischen Szenarien veranschaulicht. Nach dem Start auf einem NFC-fähigen Smartphone fordert die mobile App den Benutzer auf, die Karte gegen den Bereich der NFC-Antenne des Smartphones zu halten, um die vollständige Benutzeroberfläche der mobilen App zu aktivieren (Abbildung 3).
Abbildung 3: Eine vorkonfigurierte Android-App, die von der Coinfinity GmbH für das Starterkit „Blockchain Security 2Go“ entwickelt wurde, zeigt, wie die Karte nach Kontaktaufnahme mit der Smartcard (links) zur Veranschaulichung verschiedener Nutzungsszenarien Smartcard-Funktionen verwendet (rechts). (Bildquelle: Infineon Technologies)
In dieser mobilen App und anderen Bereitstellungsformen gibt Software, die auf dem Smartphone oder einem anderen Schnittstellengerät ausgeführt wird, hinter den Kulissen Befehle zur Ausführung von Funktionen, z. B. zum Erzeugen eines neuen Schlüsselpaars oder zum Abrufen von Informationen zu einem vorhandenen Schlüsselpaar. Während dieser und anderer Befehlssequenzen verlässt der private Schlüssel nie die Smartcard. In Reaktion auf Befehle, die private Schlüssel involvieren, gibt die Smartcard höchstens ein Schlüssel-Handle an das Schnittstellengerät zurück. Dieses Handle nutzt die Software des Schnittstellengeräts ihrerseits, um entsprechende Befehle auszuführen, z. B. das Abrufen des zu einem bestimmten privaten Schlüssel gehörigen öffentlichen Schlüssels (Abbildung 4).
Auf diese Weise kann die auf dem Schnittstellengerät laufende Software die für die Interaktion mit dem Blockchain-System erforderlichen Vorgänge vollumfänglich ausführen, ohne die geheimen Daten zu gefährden.
Abbildung 4: Ein Schnittstellengerät wie ein Smartphone oder ein Smartcard-Lesegerät gibt Befehle wie diese Anforderung zur Schlüsselerzeugung an eine „Blockchain Security 2Go“-Smartcard von Infineon aus, die ein Paar aus privatem/öffentlichem Schlüssel erzeugt und den öffentlichen Schlüssel zurückgibt, ohne den privaten Schlüssel offenzulegen. (Bildquelle: Infineon Technologies)
Die Software des Schnittstellengeräts behält die Verantwortung für die Ausführung anwendungsspezifischer Funktionen, z. B. die Umwandlung des öffentlichen Schlüssels in die (in der Regel eindeutige) Blockchain-Adresse, die für jede Transaktion verwendet wird. Eine Bitcoin-Adresse verwendet den öffentlichen Schlüssel beispielsweise als Eingabe für einen Einweg-Hashing-Algorithmus, der eine Adresse generiert, die vom öffentlichen Schlüssel abhängt, aber nicht für das erneute Erzeugen des öffentlichen Schlüssels verwendet werden kann.
Für das Signieren einer Transaktionsanforderung gibt die Schnittstelle auf ähnliche Weise einen Befehl und ein zugehöriges Hash-Ergebnis an die Smartcard aus. Als Antwort sendet die Smartcard die Signatur an das Schnittstellengerät zurück (Abbildung 5).
Abbildung 5: Das Signieren einer Transaktion erfordert die Verwendung eines privaten Schlüssels. Bei der „Blockchain Security 2Go“-Smartcard von Infineon erhält ein Schnittstellengerät die Signatur, ohne den wichtigen privaten Schlüssel offenzulegen. (Bildquelle: Infineon)
APDUs (Application Protocol Data Units)
Bei jedem Befehl und jeder Antwort interagieren ein Schnittstellengerät und eine Smartcard mithilfe von APDUs (Application Protocol Data Units), die in Teil 4 der ISO/IEC-Norm 7816 definiert sind. Bei jeder Interaktion mit der Smartcard gibt das Schnittstellengerät Dienstanforderungen im APDU-Befehlsformat nach ISO/IEC-7816 aus und empfängt (optionale) Antworten im APDU-Standardformat (Abbildung 6).
Abbildung 6: ISO/IEC 7816-Standardformate für Befehls-APDUs und Antwort-APDUs bilden die Grundlage für die Kommunikation zwischen Schnittstellengeräten und kompatiblen Smartcards wie der „Blockchain Security 2Go“-Smartcard von Infineon. (Bildquelle: Infineon Technologies)
Innerhalb einer Befehls-APDU werden die unterstützten Anweisungen und Parameter vom Smartcard-Anbieter im Einklang mit den im Zielanwendungsbereich verwendeten Industriestandards definiert. Infineon definiert für seine „Blockchain Security 2Go“-Smartcards einen Kernsatz mit Befehlen, die für die Nutzung der Funktionen der Smartcard erforderlich sind (Tabelle 1).
Tabelle 1: Befehlssatz für die „Blockchain Security 2Go“-Smartcard von Infineon. (Quelle der Tabelle: erstellt von DigiKey anhand von Daten von Infineon Technologies)
Zum Starten einer neuen Sitzung erstellt die Software des Schnittstellengeräts beispielsweise die Befehls-APDU SELECT APPLICATION mit einem Datenwert für die feste Anwendungs-ID (AID), die von Infineon für das „Blockchain Security 2Go“-Starterkit bereitgestellt wird. Nach dem Empfang dieser Befehls-APDU initialisiert sich die Smartcard für eine neue Sitzung und übermittelt die entsprechende Antwort-APDU, die einige Smartcard-Metadaten enthält (Abbildung 7).
Abbildung 7: Infineon stellt für seine „Blockchain Security 2Go“-Smartcard die spezifischen APDU-Feldwerte bereit, die für Befehle benötigt werden und in Antworten und Fehlercodes wie diesem Satz zur Initialisierung der Smartcard erwartet werden. Dazu gehört die von Infineon bereitgestellte feste Anwendungs-ID (AID). (Bildquelle: Infineon Technologies)
Kundenspezifische Software
Entwickler müssen bei der Programmierung neuer Anwendungen mit „Blockchain Security 2Go“-Smartcards nicht auf dieser niedrigen Ebene arbeiten. In seinem „Blockchain Security 2Go“-GitHub-Repository stellt Infineon Beispielanwendungen und die zugehörige Dokumentation zur Nutzung der Smartcard bereit.
Zudem veröffentlicht Infineon in seinem GitHub-Repository mit Android-Code für BlockchainSecurity2Go den vollständigen Java-Quellcode für seine mobile Android-App. Auf der Grundlage dieser Codebasis können sich Softwareprogrammierer rasch die wichtigsten Designmuster aneignen, darunter die Initialisierung einer Smartcard-Sitzung (selectApplication()), das Auslesen eines öffentlichen Schlüssels aus einer Smartcard (readPublicKeyFromCard()) und das Erstellen eines neuen Schlüsselpaares (generateNewSecp256K1Keypair()), wenn auf der Karte nicht bereits ein öffentlicher Schlüssel vorhanden ist (Listing 1).
Kopieren
/**
* 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;
}
}
}
Listing 1: Infineon stellt den vollständigen Quellcode für seine „Blockchain Security 2Go“-Android-App zur Verfügung, die grundlegende Interaktionen wie das Auslesen eines öffentlichen Schlüssels oder das Erstellen eines neuen Paares aus privatem/öffentlichem Schlüssel demonstriert. (Codequelle: Infineon Technologies)
Utility-Klassen in der Java-Codebasis implementieren detaillierte Interaktionen wie das Erstellen von SELECT APPLICATION APDU. Routinen, die die in Listing 2 (unten) gezeigte Member-Funktion aufrufen, übergeben einen aid-Parameter mit der Infineon Blockchain Security 2Go AID, die an früherer Stelle im Paket wie folgt deklariert wird:
Kopieren
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;
}
}
Listing 2: Die Quelldistribution der „Blockchain Security 2Go“-Android-App von Infineon veranschaulicht die Erstellung einer Befehls-APDU für die Initialisierung der Smartcard. (Codequelle: Infineon Technologies)
Für das schnelle Entwickeln stellt Infineon zudem eine „Blockchain Security 2Go“-Python-Bibliothek und eine auf dieser Bibliothek aufsetzende Befehlszeilenschnittstelle bereit. Wie die Java-Version veranschaulicht der Python-Code das einfache Designmuster, das für die Ausführung von Smartcard-Vorgängen wie das Erzeugen eines Schlüsselpaares erforderlich ist (Listing 3).
Kopieren
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
Listing 3: Die „Blockchain Security 2Go“-Python-Bibliothek von Infineon und die zugehörige Befehlszeilenschnittstelle unterstützen die Schnellentwicklung mit einem kompletten Satz Dienstroutinen wie die select_app()-Funktion für die Initialisierung einer „Blockchain Security 2Go“-Smartcard und generate_keypair(), die jeweils grundlegende Designmuster für die Smartcard-Interaktion veranschaulichen. (Codequelle: Infineon Technologies)
Die Python-Bibliothek „Blockchain Security 2Go“ baut in typischer Pythonic-Manier auf fertig verfügbaren Modulen von Drittanbietern auf. Insbesondere verwendet die Infineon-Bibliothek das viel genutzte PyScard-Modul, das seine Funktionen in einer eigenen Klassendefinition zusammenfasst. So startet die „Blockchain Security 2Go“-Python-Bibliothek beispielsweise eine Smartcard-Sitzung, wenn ein PC/Smartcard-Lesegerät gefunden wird. Für das primäre blocksec2go-Modul der „Blockchain Security 2Go“-Python-Bibliothek erfolgt dies mittels der Funktion open_pyscard(), die eine Member-Funktion in einer Bibliotheksklasse ist, die PyScard-Funktionen zusammenfasst (Listing 4).
Kopieren
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)
Listing 4: Die „Blockchain Security 2Go“-Python-Bibliothek von Infineon fasst in dieser Klasse Interaktionen mit dem PyScard-Modul eines Drittanbieters zusammen und ruft mit ihren Member-Funktionen PyScard-Funktionen auf. (Codequelle: Infineon Technologies)
Fazit
Die Blockchain-Technologie bietet einen Rahmen, der den Zugriff auf Informationen erweitert, ohne deren Integrität oder Authentizität zu beeinträchtigen. Statt dafür eine zentrale Instanz zu verwenden, nutzt ein Blockchain-System Kryptografie, um Transaktionen zu verifizieren und vor Änderungen zu schützen. Dabei benötigen die privaten Schlüssel allerdings robuste Sicherheitsmechanismen, um den Verlust der Kontrolle über die Transaktionen der Benutzer und die Gefährdung des Blockchain-Systems zu verhindern.
Wie geschildert, bietet das Starterkit „Blockchain Security 2Go“ von Infineon mit der zugehörigen Open-Source-Software Blockchain-Systemintegratoren eine schlüsselfertige Sicherheitslösung und Benutzern ein einfacheres und sichereres Verfahren für die Ausführung von Blockchain-Transaktionen.
Haftungsausschluss: Die Meinungen, Überzeugungen und Standpunkte der verschiedenen Autoren und/oder Forumsteilnehmer dieser Website spiegeln nicht notwendigerweise die Meinungen, Überzeugungen und Standpunkte der DigiKey oder offiziellen Politik der DigiKey wider.



