Bygg in säkerhet i blockkedjetillämpningar – del 2: Snabb distribuering med en nyckelfärdig lösning
Bidraget med av DigiKeys nordamerikanska redaktörer
2019-10-15
Redaktörens anmärkning: Blockkedjetekniken och dess transaktionsmetoder är komplexa. Del 1 i den här serien med två delar ger en översikt över blockkedjestrukturen och dess transaktionsprocess. Detta ger kontext som förklarar varför skydd av privata nycklar utgör kärnan i blockkedjesäkerhet, vilket leder vidare till en introduktion av en nyckelfärdig lösning för skydd av privata nycklar. Här följer del 2 som visar hur utvecklarna enklare kan skydda blockkedjetransaktioner med den här nyckelfärdiga, maskinvarubaserade lösningen.
Utöver sin användning för kryptovalutor kan blockkedjetekniken även erbjuda utvecklarna en säker infrastruktur med bred tillämpbarhet. Den decentraliserade arkitekturen eliminerar behovet av en central auktoritetskälla och förlitar sig istället på privata nycklar och kryptografiska metoder för att skydda tillgångar och deras utbyte mellan parter. Därför bygger säkerheten i ett blockkedjesystem kritiskt på nycklarnas säkerhet och deras korrekta användning i robusta algoritmer.
Trots att lämpliga algoritmer är tillgängliga, kräver implementeringen betydande expertis och erfarenhet för att utveckla en säker lösning och integrera den i måltillämpningen. Utan lämpliga verktyg för att bygga in blockkedjan i tillämpningens kärna kan utvecklarnas ansträngningar fördröjas eller bli sårbara för cyberbrottslingar.
Den här artikeln visar hur utvecklarna enklare kan skydda blockkedjetransaktioner med en nyckelfärdig, maskinvarubaserad lösning för blockkedjesäkerhet från Infineon Technologies.
Säkerhet med privat nyckel
Blockkedjor eliminerar behovet av en central myndighet för att godkänna transaktioner. Istället bygger den här tekniken på konsensusmekanismerna för att bibehålla integriteten hos en blockkedja som förlängs kontinuerligt med en uppsättning transaktioner som signerats och verifierats med kryptografi och ett privat/offentligt nyckelpar. Privata nycklar fungerar som ägaruppgifter i blockkedjesystem. Förlust eller exponering av privata nycklar genom olyckshändelser eller stöld har redan orsakat betydande kryptovalutaförluster. Därför är de privata nycklarnas säkerhet av avgörande vikt när blockkedjetillämpningar distribueras.
Tidigare metoder som baseras på programvara eller begränsad maskinvarusäkerhet kan lämna de privata nycklarna sårbara för ett stort urval av angrepp. Till skillnad mot detta finns mer robusta lösningar som bygger på säkerhetsstyrenheter som är utformade med djupt skydd mot diverse direkta och indirekta hot. Med en lösning baserad på den här typen av säkerhetsstyrenhet ger Infineon Blockchain Security 2Go startsats (BLOCKCHAINSTARTKITTOBO1) det djupgående skydd som krävs för blockkedjesäkerhet.
Istället för att implementera en egen lösning med de utmaningar det innebär kan utvecklarna tillhandahålla användarna kontaktlösa smartkort med inbyggt skydd för blockkedjesäkerhetsmekanismer inklusive signering av transaktioner, det kritiska första steget i att förlänga en blockkedja (figur 1).
Figur 1: Smartkortet Infineon Blockchain Security 2Go förenklar distribueringen av blockkedjesäkerhet med inbyggt stöd för blockkedjemekanismer inklusive signering av transaktioner, vilket används för att förlänga en blockkedja. (Bildkälla: Infineon Technologies)
Säker plattform
Startsatsen Infineon Blockchain Security 2Go ger utvecklare av blockkedjesystem en nyckelfärdig säkerhetslösning som eliminerar behovet av sekretessavtal som normalt krävs för att förvärva säkerhetsenheter.
Satsen är utformad för snabb distribuering med programvara med öppen källkod från Infineon och innehåller fem smartkort som implementerar viktiga blockkedjemekanismer inklusive generering av säkra nycklar, signaturskapande och PIN-autentisering. Det relaterade Infineon Security 2Go 10-kortpaketet (BLOCKCHAIN10CARDSTOBO1) ger utvecklarna en ytterligare källa till dessa smartkort.
Korten uppfyller standarden ISO/IEC 7810 ID-1 som används för konventionella betalkort och ID-kort i vissa regioner. För anslutning har smartkorten en integrerad klass 1-antenn som baseras på ISO/IEC 14443 för kontaktlösa kort med närfältkommunikation (NFC).
Inbäddat i varje kort finns en säkerhetsstyrenhet som tillhandahåller maskinvarubaserad säkerhet för att skapa och lagra upp till 255 privata/offentliga nyckelpar samt körning av krypteringsalgoritmer. Tillsammans med en integrerad äkta slumptalsgenerator (TRNG) ger korten stöd för algoritmer för både symmetrisk kryptografi med 256-bitars AES- (Advanced Encryption Standard) och asymmetrisk kryptografi med 256-bitars kryptering med elliptisk kurva (ECC), förinstallerad med secp256k1 ECC-kurvan som normalt används för kryptovalutor, inklusive Bitcoin och Ethereum.
Med det dedikerade stödet för blockkedjebaserade säkerhetsmekanismer erbjuder korten en direkt lösning för att säkra blockkedjetransaktioner. Istället för att lägga tid på att bygga upp säkra signeringsmetoder kan integratörer av blockkedjesystem enkelt ge användarna smartkort som de kan använda när de interagerar med det distribuerade blockkedjesystemet.
Enklare interaktioner
För användarna innebär smartkorten en smidig metod att utföra blockkedjetransaktioner samtidigt som deras privata nycklar hålls helt säkra. Korten är utformade för att fungera med programvara som körs på en gränssnittsenhet som en NFC-smarttelefon eller en dator som är utrustad med en fristående NFC-smartkortläsare. När användarna kör sin blockkedjetillämpning aktiverar de kortets funktioner genom att placera det på gränssnittsenheten (figur 2).
Figur 2: Användarna startar smartkortfunktionen genom att hålla kortet nära NFC-läsarantennen, som det blanka området bakpå en Google Pixel-smarttelefon, som visas här. (Bildkälla: Infineon Technologies)
För att direkt kunna utvärdera Security 2Go-smartkorten erbjuder Infineon en Android-mobilapp som demonstrerar hur de används i typiska scenarion. När mobilappen har startats på en NFC-kompatibel smarttelefon uppmanar mobilappen användaren att placera kortet mot telefonens NFC-antennområde, vilket aktiverar det fullständiga mobilappgränssnittet (figur 3).
Figur 3: En Android-app som utvecklats av Coinfinity GmbH för Blockchain Security 2Go-startsatsen visar hur kortet efter att det begärt kontakt med smartkortet (till vänster) använder smartkortfunktionerna för att demonstrera olika användningsscenarion (till höger). (Bildkälla: Infineon Technologies)
Bakom kulisserna i den här mobilappen och andra distribueringar finns programvara som körs på smarttelefonen eller andra gränssnittsenheter och som utfärdar kommandon för att utföra funktioner som att generera ett nytt nyckelpar eller hämta information om ett befintligt nyckelpar. Under dessa och andra kommandosekvenser lämnar den privata nyckeln aldrig smartkortet. Som svar på kommandon som innefattar privata nycklar returnerar smartkortet som mest ett nyckel-ID till gränssnittsenheten. I sin tur använder gränssnittsenhetens programvara detta ID för att köra relaterade kommandon, som hämtning av den offentliga nyckeln hopparad med en särskild privat nyckel (figur 4).
Med den här metoden kan programvara som körs i gränssnittet slutföra åtgärder som krävs för att interagera med blockkedjesystemet utan att äventyra hemliga data.
Figur 4: En gränssnittsenhet som en smarttelefon eller smartkorläsare utfärdar kommandon som denna begäran om nyckelgenerering till ett Infineon Blockchain Security 2Go-smartkort, som skapar ett privat/offentligt nyckelpar och returnerar den offentliga nyckeln utan att avslöja den privata nyckeln. (Bildkälla: Infineon Technologies)
Gränssnittsenhetens programvara behåller ansvaret för att utföra tillämpningsspecifika funktioner som omvandling av den offentliga nyckeln till den (normalt unika) blockkedjeadress som används för varje transaktion. Till exempel använder en Bitcoin-adress den offentliga nyckeln som ingång till en enkelriktad hash-algoritm, som i sin tur genererar en adress som bygger på den offentliga nyckeln, men inte kan användas för att återskapa den offentliga nyckeln.
Vid signering av en transaktionsbegäran utfärdar gränssnittet ett kommando med tillhörande hash-resultat till smartkortet. Som svar returnerar smartkortet signaturen till gränssnittsenheten (figur 5).
Figur 5: När en transaktion ska signeras måste en privat nyckel användas, men med Infineon Blockchain Security 2Go-smartkortet tar en gränssnittsenhet emot signaturen utan att exponera den privata nyckeln. (Bildkälla: Infineon)
APDU
För varje kommando och svar interagerar en gränssnittsenhet och ett smartkort med APDU (Application Protocol Data Units), som definieras i del 4 av standarden ISO/IEC 7816. För varje interaktion med smartkortet utfärdar gränssnittsenheten tjänsteförfrågningar i ISO/IEC-7816-standardens kommando-APDU-format och tar emot (eventuella) svar i standardens svars-APDU-format (figur 6).
Figur 6: ISO/IEC 7816-standardens format för kommando-APDU:er och svars-APDU:er utgör basen för kommunikationen mellan gränssnittsenheter och kompatibla smartkort som Infineon Blockchain Security 2Go-smartkortet. (Bildkälla: Infineon Technologies)
I en kommando-APDU definieras de stödda instruktionerna och parametrarna av smartkortleverantören i överensstämmelse med de industristandarder som används inom måltillämpningsområdet. För sina Blockchain Security 2Go-smartkort definierar Infineon en grundläggande uppsättning kommandon som krävs för att utnyttja smartkortets funktioner (tabell 1).
Tabell 1: Kommandon för Infineon Blockchain Security 2Go-smartkortet (Tabellkälla: skapad av DigiKey utifrån data från Infineon Technologies)
För att exempelvis starta en ny session, konstruerar gränssnittsenhetens programvara kommando-ADPU:n SELECT APPLICATION med ett datavärde för den fasta applikationssidentifieraren (AID) som Infineon tillhandahåller för Blockchain Security 2Go-startsatsen. Efter att ha tagit emot kommando-APDU:t inleder smartkortet en ny session och överför motsvarande svars-APDU som inkluderar vissa smartkortmetadata (figur 7).
Figur 7: För Blockchain Security 2Go-smartkortet erbjuder Infineon de specifika APDU-fältvärden som krävs för kommandon och som förväntas i svar och felkoder som den här uppsättningen för att initiera smartkortet, som inkluderar den fasta tillämpningsidentifieraren (AID) från Infineon. (Bildkälla: Infineon Technologies)
Anpassad programvara
Utvecklarna behöver inte arbeta på den här låga nivån när de skapar nya tillämpningar med Blockchain Security 2Go-smartkort. I sin Blockchain Security 2Go GitHub-katalog erbjuder Infineon provtillämpningar och dokumentation om smartkortanvändning.
Infineon inkluderar den kompletta Java-källkoden för sin Android-mobilapp i sin BlockchainSecurity2Go Android-kodade GitHub-katalog. Genom att utforska den här kodbasen kan programmerare snabbt lära sig grundläggande designmönster, som att initiera smartkortsessioner (selectApplication()), läsa en offentlig nyckel från ett smartkort (readPublicKeyFromCard()) och skapa ett nytt nyckelpar (generateNewSecp256K1Keypair()) om det inte redan finns en offentlig nyckel på kortet (lista 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; } } }
Lista 1: Infineon erbjuder hela källkoden för sin Blockchain Security 2Go Android-app som demonstrerar grundläggande interaktioner som att läsa offentliga nycklar eller skapa ett nytt privat/offentligt nyckelpar. (Kodkälla: Infineon Technologies)
Verktygsklasser i Java-kodbasen implementerar detaljerade interaktioner som att skapa SELECT APPLICATION APDU. Rutiner som anropar medlemsfunktionen som visas i lista 2 (nedan) förmedlar en hjälpparameter som håller Infineon Blockchain Security 2Go AID, som deklareras tidigare i paketet enligt följande:
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; } }
Lista 2: Infineon Blockchain Security 2Go Android-appens källdistribution illustrerar skapandet av en kommando-APDU för att initiera smartkortet. (Kodkälla: Infineon Technologies)
För snabb utveckling, erbjuder Infineon dessutom ett Blockchain Security 2Go Python-bibliotek och ett kommandoradsgränssnitt som är byggt ovanpå det här biblioteket. Som med Java-versionen demonstrerar Python-koden det enkla designmönster som krävs för att utföra smartkortåtgärder, såsom att generera ett nyckelpar (lista 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.
Eventuella undantag som kastas av reader-omslutningen släpps igenom.
""" 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. Det ID som identifierar detta nyckelpar returneras. En nyckel som använder kurvan `secp256k1`_ genereras.
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.
Eventuella undantag som kastas av reader-omslutningen släpps igenom.
.. _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
Lista 3: Infineon Blockchain Security 2Go Python-biblioteket och medföljande kommandoradgränssnitt underlättar snabb utveckling med en fullständig uppsättning servicerutiner som funktionen select_app() för att initiera ett Blockchain Security 2Go-smartkort och generate_keypair(), som båda demonstrerar grundläggande designmönster för smartkortinteraktion. (Kodkälla: Infineon Technologies)
På typiskt Python-manér bygger Blockchain Security 2Go Python-biblioteket på lättillgängliga tredjepartsmoduler. Framförallt använder Infineon-biblioteket den populära pyscard-modulen som omsluter sina funktioner i en egen klassdefinition. Till exempel inleder Blockchain Security 2Go Python-biblioteket en smartkortsession genom att söka efter en dator/smartkort-läsare (PC/SC). För Blockchain Security 2Go Python-bibliotekets primära blocksec2go-modul sker den här upptäckten med funktionen open_psycard(), som är en medlemsfunktion i en biblioteksklass som omsluter pyscard-funktioner (lista 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)
Lista 4: Infineon Blockchain Security 2Go Python-biblioteket omsluter interaktioner med tredjeparts-pyscard-modulen i den här klassen med sina medlemsfunktioner för att anropa pyscard-funktioner. (Kodkälla: Infineon Technologies)
Slutsats
Blockkedjetekniken erbjuder ett ramverk som ökar tillgängligheten till information utan att riskera dess integritet eller autenticitet. Istället för att förlita sig på en central auktoritetskälla använder ett blockkedjesystem kryptografi för att verifiera transaktioner och skydda dem mot modifiering. En förutsättning för den här metoden är att privata nycklar kräver robusta säkerhetsmekanismer för att förhindra förlust av kontroll över användartransaktioner och att blockkedjesystemet utsätts för risk.
Med sin förknippade programvara med öppen källkod erbjuder Infineon Blockchain Security 2Go-startsatsen utvecklare av blockkedjesystem en direkt säkerhetslösning och ger användarna en enklare och säkrare metod för att köra blockkedjetransaktioner.
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.



