Beveiliging inbouwen in blockchain-toepassingen: Deel 2 – Snelle implementatie met een kant-en-klare oplossing
Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey
2019-10-15
Opmerking van de redactie: de details van blockchain-technologie en de transactiemethoden van deze technologie zijn bijzonder complex. Deel 1 van deze tweedelige serie geeft een overzicht van de blockchain-structuur en het blockchain-transactieproces. Dit artikel geeft de context die nodig is om te kunnen begrijpen waarom bescherming van privésleutels de kern van blockchain-beveiliging vormt en introduceert een kant-en-klare oplossing voor de beveiliging van privésleutels. In Deel 2 van deze serie leest u hoe ontwikkelaars blockchain-transacties met deze kant-en-klare, op hardware gebaseerde oplossing gemakkelijker kunnen beschermen.
Het gebruik van blockchains voor cryptovaluta is bekend, maar deze technologie kan ontwikkelaars daarnaast ook een veilige infrastructuur met brede toepasbaarheid bieden. De gedecentraliseerde architectuur maakt een centrale autoriteit overbodig, aangezien in plaats daarvan gebruik wordt gemaakt van privésleutels en cryptografiemethoden om activa en hun uitwisseling tussen partijen te beschermen. Bijgevolg hangt de beveiliging van een blockchain-systeem in essentie af van de beveiliging van sleutels en het juiste gebruik ervan in degelijk geconstrueerde algoritmen.
Dergelijke algoritmen bestaan weliswaar al, maar de implementatie ervan, teneinde een veilige oplossing te ontwikkelen en deze in de doeltoepassing te integreren, vereist een aanzienlijke expertise en ervaring. Zonder de juiste tools om de blockchain in het hart van hun toepassing in te bouwen, kunnen ontwikkelaars grote obstakels op hun pad vinden of zelfs kwetsbaar worden voor cyberdiefstal.
Dit artikel laat zien hoe ontwikkelaars blockchain-transacties gemakkelijker kunnen beschermen met behulp van een kant-en-klare, op hardware gebaseerde oplossing voor blockchain-beveiliging van Infineon Technologies.
Beveiliging van privésleutels
Blockchains maken een centrale autoriteit voor goedkeuring van transacties overbodig. In plaats daarvan maakt deze technologie gebruik van consensusmechanismen om de integriteit van een blockchain, die continu wordt uitgebreid met transacties die zijn ondertekend en geverifieerd met behulp van cryptografie en een sleutelpaar (privésleutel/openbare sleutel), te handhaven. In feite dienen privésleutels in blockchain-systemen als de inloggegevens van de eigenaar. Verlies of openbaarmaking van deze sleutels, onopzettelijk of door diefstal, heeft al aanzienlijke cryptovalutaverliezen tot gevolg gehad. Bij de implementatie van blockchain-toepassingen is de beveiliging van privésleutels daarom een cruciaal aspect.
Bij oudere benaderingen, gebaseerd op software of beperkte hardwarebeveiliging, kunnen privésleutels kwetsbaar blijven voor aanvallen van uiteenlopende aard. Beter werkende oplossingen worden daarentegen geconstrueerd op basis van beveiligingscontrollers die zijn ontworpen met een diepgaande bescherming tegen diverse directe en indirecte bedreigingen. De Blockchain Security 2Go-starterkit (BLOCKCHAINSTARTKITTOBO1) van Infineon gebruikt een oplossing die op dit type beveiligingscontroller is gebaseerd en biedt de diepgaande bescherming die nodig is voor blockchain-beveiliging.
In plaats van de uitdagingen aan te gaan die het implementeren van hun eigen oplossing met zich mee brengt, kunnen ontwikkelaars hun gebruikers contactloze smartcards bieden met ingebouwde ondersteuning voor blockchain-beveiligingsmechanismen, waaronder ondertekening van transacties, de cruciale, eerste stap bij het uitbreiden van een blockchain (Afbeelding 1).
Afbeelding 1: de Blockchain Security 2Go-smartcard van Infineon vereenvoudigt de implementatie van blockchain-beveiliging met ingebouwde ondersteuning voor blockchain-mechanismen, waaronder de ondertekening van transacties voor het uitbreiden van een blockchain. (Bron afbeelding: Infineon Technologies)
Veilig platform
De Blockchain Security 2Go-starterkit van Infineon biedt blockchain-systeemintegrators met een kant-en-klare beveiligingsoplossing die de geheimhoudingsovereenkomsten, die doorgaans vereist zijn voor het aanschaffen van beveiligingsapparatuur, overbodig maakt.
De kit, ontworpen voor snelle implementatie met behulp van open-source software van Infineon, bevat vijf smartcards die belangrijke blockchain-mechanismen implementeren, waaronder de generatie van beveiligingssleutels, de creatie van handtekeningen en PIN-authenticatie. Het bijbehorende Infineon Security 2Go 10 card-pakket (BLOCKCHAIN10CARDSTOBO1) biedt ontwikkelaars een extra set van deze smartcards.
De kaarten voldoen aan de ISO/IEC 7810 ID-1-norm die in bepaalde regio's wordt gebruikt voor conventionele betaalkaarten en identiteitskaarten. Voor de connectiviteit beschikken de smartcards over een geïntegreerde antenne van klasse 1, gebaseerd op ISO/IEC 14443 voor contactloze kaarten die near-field communicatie (NFC) gebruiken.
In elke card is een beveiligingscontroller ingebed die op hardware gebaseerde beveiliging biedt voor het aanmaken en opslaan van maximaal 255 paren van privésleutels/openbare sleutels en voor het uitvoeren van cryptografie-algoritmen. Samen met een geïntegreerde True Random Number Generator (TRNG) ondersteunen de kaarten algoritmen voor zowel symmetrische cryptografie met 256-bit Advanced Encryption Standard (AES) als asymmetrische cryptografie met 256-bit elliptische curve-cryptografie (ECC), vooraf geladen met de secp256k1 ECC-curve die gewoonlijk wordt gebruikt voor cryptovaluta zoals Bitcoin en Ethereum.
Met hun speciale ondersteuning voor blockchain-beveiligingsmechanisen bieden de kaarten een directe oplossing voor de beveiliging van blockchain-transacties. In plaats van tijd te besteden aan het bouwen van methoden voor veilige ondertekening, kunnen blockchain-systeemintegrators eenvoudig smartcards aan gebruikers verstrekken om te gebruiken bij interactie met het geïmplementeerde blockchain-systeem.
Vereenvoudigde interacties
Voor gebruikers bieden de smartcards een rechtstreekse methode om blockchain-transacties uit te voeren met optimale beveiliging van hun privésleutels. De kaarten zijn ontworpen om te werken met software die op een interface-apparaat draait, bijvoorbeeld een NFC-smartphone of computer met een autonome NFC-smartcardlezer. Met geopende blockchain-toepassing activeren gebruikers de functies van de kaart door de kaart op het interface-apparaat te plaatsen (Afbeelding 2).
Afbeelding 2: gebruikers activeren de functionaliteit van de smartcard door deze in de buurt van de antenne van de NFC-lezer te brengen, bijvoorbeeld het glanzende gedeelte op de achterkant van een Google Pixel-smartphone, zoals hier getoond. (Bron afbeelding: Infineon Technologies)
Voor een onmiddellijke evaluatie van de Security 2Go-smartcards biedt Infineon een mobiele Android-app die het gebruik van de kaarten in standaardsituaties demonstreert. Nadat de mobiele app op een NFC-compatibele smartphone is geopend, wordt de gebruiker uitgenodigd om de kaart tegen het NFC-antennegebied van de smartphone te plaatsen, waardoor de volledige mobiele app-interface wordt geactiveerd (Afbeelding 3).
Afbeelding 3: een kant-en-klare Android-app, ontwikkeld door Coinfinity GmbH voor de Blockchain Security 2Go-starterkit, laat zien hoe de kaart na om contact met de smartcard te hebben gevraagd (links), de smartcardfuncties gebruikt om de verschillende gebruikssituaties te demonstreren (rechts). (Bron afbeelding: Infineon Technologies)
Achter de schermen in deze mobiele app en andere implementaties geeft software, die op de smartphone of een ander interface-apparaat draait, opdrachten om functies uit te voeren, zoals een nieuwe sleutelpaar genereren of informatie over een bestaand sleutelpaar verkrijgen. Tijdens deze en andere opdrachtreeksen komt de privésleutel de smartcard nooit uit. In antwoord op opdrachten waarbij privésleutels zijn betrokken, retourneert de smartcard hooguit een sleutel-'handle' naar het interface-apparaat. De software van het interface-apparaat gebruikt die 'handle' om gerelateerde opdrachten uit te voeren, bijvoorbeeld het ophalen van de openbare sleutel die een paar vormt met een bepaalde privésleutel (Afbeelding 4).
Door deze benadering te gebruiken kan software, die op de interface draait, de bewerkingen die nodig zijn om met het blockchain-systeem te interageren volledig uitvoeren zonder de geheime gegevens in gevaar te brengen.
Afbeelding 4: een interface-apparaat als bijvoorbeeld een smartphone of smartcard-lezer geeft opdrachten, zoals dit verzoek om sleutelgeneratie aan een Infineon Blockchain Security 2Go-smartcard, die een sleutelpaar van privésleutel/openbare sleutel aanmaakt en de openbare sleutel teruggeeft zonder de privésleutel te onthullen. (Bron afbeelding: Infineon Technologies)
De software van het interface-apparaat is verantwoordelijk voor het uitvoeren van toepassingsspecifieke functies zoals het transformeren van de openbare sleutel in het (gewoonlijke unieke) blockchain-adres dat voor elke transactie wordt gebruikt. Een Bitcoin-adres gebruikt bijvoorbeeld de openbare sleutel als invoer voor een hashing-algoritme in één richting, dat een adres genereert dat afhankelijk is van de openbare sleutel maar dat niet kan worden gebruikt om de openbare sleutel opnieuw te creëren.
Voor het ondertekenen van een transactieverzoek geeft de interface op dezelfde manier een opdracht en bijbehorend hash-resultaat aan de smartcard. In antwoord hierop geeft de smartcard de handtekening terug aan het interface-apparaat (Afbeelding 5).
Afbeelding 5: om een transactie te onderteken is gebruik van een privésleutel vereist, naar met de Blockchain Security 2Go-smartcard van Infineon ontvangt een interface-apparaat de handtekening zonder blootstelling van de zo belangrijke privésleutel. (Bron afbeelding: Infineon)
Application Protocol Data Units (applicatieprotocol-data-eenheden)
Voor elke opdracht en antwoord interageren interface-apparaat en smartcard met behulp van applicatieprotocol-data-eenheden (Application Protocol Data Units - APDU's), zoals gedefinieerd in deel 4 van de ISO/IEC 7816-norm. Voor iedere interactie met de smartcard geeft het interface-apparaat serviceverzoeken af in het standaard APDU-formaat voor opdrachten (ISO/IEC-7816) en ontvangt (optionele) antwoorden in het standaard APDU formaat voor antwoorden (Afbeelding 6).
Afbeelding 6: ISO/IEC 7816 standaardformaten voor opdracht-APDU's en antwoord-APDU's vormen de basis voor de communicatie tussen interface-apparaten en conforme smartcards zoals de Blockchain Security 2Go-smartcard van Infineon. (Bron afbeelding: Infineon Technologies)
Binnen een opdracht-APDU worden de ondersteunde instructies en parameters gedefinieerd door de leverancier van de smartcard, in overeenstemming met de industriestandaarden die van kracht zijn in het beoogde toepassingsgebied. Voor zijn Blockchain Security 2Go-smartcards definieert Infineon een kernset van opdrachten die nodig zijn om de functionele mogelijkheden van de smartcard te benutten (Tabel 1).
Tabel 1: opdrachtenset voor de Blockchain Security 2Go-smartcard van Infineon. (Bron tabel: door DigiKey gecreëerd op basis van gegevens van Infineon Technologies)
Bijvoorbeeld, om een nieuwe sessie te starten construeert de software van het interface-apparaat de opdracht APDU 'SELECT APPLICATION' (applicatie selecteren) met een datawaarde voor de vaste applicatie-identificator (AID) die Infineon voor de Blockchain Security 2Go-starterkit verstrekt. Na die opdracht-APDU te hebben ontvangen initialiseert de smartcard zichzelf voor een nieuwe sessie en verstuurt de overeenkomstige antwoord-APDU, die enige smartcard-metadata bevat (Afbeelding 7).
Afbeelding 7: voor zijn Blockchain Security 2Go-smartcard geeft Infineon de specifieke APDU-veldwaarden die nodig zijn voor opdrachten en verwachte antwoorden en foutcodes, zoals deze set voor het initialiseren van de smartcard, die de door Infineon verstrekte vaste applicatie-identificator (AID) bevat. (Bron afbeelding: Infineon Technologies)
Aangepaste software
Ontwikkelaars hoeven niet op dit lage niveau te werken wanneer ze nieuwe applicaties met Blockchain Security 2Go-smartcards maken. In zijn Blockchain Security 2Go GitHub-repository biedt Infineon voorbeeldtoepassingen en documentatie over het gebruik van smartcards.
In zijn BlockchainSecurity2Go Android code GitHub-repository heeft Infineon de complete Java broncode voor zijn mobiele Android-app opgenomen. Door deze codebasis te verkennen, kunnen softwareprogrammeurs snel de belangrijkste ontwerppatronen aanleren, bijvoorbeeld het initialiseren van een smartcardsessie (selectApplication()), het aflezen van een openbare sleutel uit een smartcard (readPublicKeyFromCard()) en het maken van een nieuw sleutelpaar (generateNewSecp256K1Keypair()) als er nog geen openbare sleutel op de kaart bestaat (Lijst 1).
Copy /** * 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; } } }
Lijst 1: Infineon verstrekt de complete broncode voor zijn Blockchain Security 2Go Android-app, met een demonstratie van basale interacties zoals het aflezen van een openbare sleutel of het maken van een nieuw paar van privésleutel/openbare sleutel. (Bron code: Infineon Technologies)
Hulpprogramma's in de Java-codebasis implementeren gedetailleerde interacties, zoals het aanmaken van de 'SELECT APPLICATION' APDU. Routines die de lidfunctie uit Lijst 2 (hieronder) oproepen, passeren een aid-parameter die de Blockchain Security 2Go-AID van Infineon bevat die eerder in het pakket als volgt is opgegeven:
Copy 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; } }
Lijst 2: de Blockchain Security 2Go Android app brondistributie van Infineon illustreert de creatie van een commando APDU voor het initialiseren van de smartcard. (Bron code: Infineon Technologies)
Voor snelle ontwikkeling biedt Infineon ook een Blockchain Security 2Go Python-bibliotheek een commandoregel-interface die boven op deze bibliotheek is geconstrueerd. Net als de Java-versie demonstreert de Python-code het eenvoudige ontwerppatroon dat nodig is om smartcardbewerkingen zoals het genereren van een sleutelpaar uit te voeren (Lijst 3).
Copy 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): """ Verzendt opdracht om nieuw sleutelpaar te genereren. Een nieuw sleutelpaar wordt gegenereerd en opgeslagen. 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
Lijst 3: de Blockchain Security 2Go Python-bibliotheek van Infineon en bijbehorende commandoregel-interface helpt bij een snelle ontwikkeling dankzij een complete set van service-routines zoals de functie select_app() voor het initialiseren van een Blockchain Security 2Go smartcard en generate_keypair(), die beide basisontwerppatronen voor smartcardinteractie laten zien. (Bron code: Infineon Technologies)
Op de kenmerkende Pythonic-wijze bouwt de Blockchain Security 2Go Python-bibliotheek voort op direct beschikbare modules van derden. In het bijzonder gebruikt de Infineon-bibliotheek de populaire pyscard-module, waarbij de functies ervan in de eigen klassedefinitie worden verpakt. De Blockchain Security 2Go Python-bibliotheek begint een smartcardsessie bijvoorbeeld wanneer een personal computer/smartcard (PC/SC) lezer wordt gevonden. Voor de primaire blocksec2go-module van de Blockchain Security 2Go Python-bibliotheek vindt deze ontdekking plaats door gebruik van de functie open_psycard(), een lidfunctie in een bibliotheekklasse die pyscard-functies verpakt (Lijst 4).
Copy 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)
Lijst 4: de Blockchain Security 2Go Python-bibliotheek van Infineon verpakt interacties met de pyscard-module van derden in deze klasse, en gebruikt zijn lidfuncties om pyscard-functies op te roepen. (Bron code: Infineon Technologies)
Conclusie
Blockchain-technologie biedt een structuur die de toegankelijkheid tot gegevens verbreedt zonder de integriteit of authenticiteit in gevaar te brengen Een blockchain-systeem berust niet op een centrale autoriteit, maar gebruikt cryptografie om transacties te verifiëren en te voorkomen dat deze gewijzigd kunnen worden. Een kernpunt binnen deze aanpak is het feit dat privésleutels degelijke beveiligingsmechanismen nodig hebben om verlies van controle over de transacties van gebruikers en aantasting van het blockchain-systeem te voorkomen.
We hebben gezien dat de Blockchain Security 2Go-starterkit met de bijbehorende open-source software blockchain-systeemintegrators biedt met een directe beveiligingsoplossing en gebruikers een eenvoudigere, veiligere methode voor het uitvoeren van blockchain-transacties biedt.
Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.



