Introdurre sicurezza nelle applicazioni blockchain - Parte 2: Implementazione veloce con una soluzione chiavi in mano

Di Stephen Evanczuk

Contributo di Editori nordamericani di DigiKey

Nota del redattore: i dettagli della tecnologia blockchain e dei metodi di transazione sono complessi. La Parte 1 di questo articolo fornisce un'introduzione alla struttura e al processo di transazione della blockchain. Illustra alcuni concetti base per capire perché la protezione delle chiavi private è al centro della sicurezza della blockchain e infine presenta una soluzione chiavi in mano per la sicurezza delle chiavi private. La Parte 2 mostrerà come gli sviluppatori possono proteggere più facilmente le transazioni blockchain utilizzando questa soluzione chiavi in mano, basata su hardware.

Oltre al tipico utilizzo nelle criptovalute, la tecnologia blockchain può offrire agli sviluppatori un'infrastruttura sicura e di ampia applicabilità. La sua architettura decentralizzata elimina la necessità di un'autorità centrale, affidandosi invece a chiavi private e a metodi di crittografia per proteggere i beni e il loro scambio tra le parti. Di conseguenza, la sicurezza di un sistema blockchain dipende in modo critico da quella delle chiavi e dal loro corretto utilizzo in algoritmi robusti.

Sebbene siano disponibili algoritmi appropriati, l'implementazione richiede competenza ed esperienza notevoli per sviluppare una soluzione sicura e integrarla nell'applicazione di destinazione. Senza gli strumenti adeguati per integrare la blockchain in un'applicazione, gli sviluppatori possono trovarsi con le spalle al muro o essere addirittura vulnerabili ai pirati informatici.

Questo articolo mostra come possono proteggere più facilmente le transazioni blockchain utilizzando una soluzione chiavi in mano basata su hardware di Infineon Technologies.

Sicurezza della chiave privata

Le blockchain eliminano la necessità di un'autorità centrale per l'approvazione delle transazioni. Questa tecnologia si basa infatti su meccanismi di consenso per mantenere l'integrità di una blockchain continuamente ampliata con un insieme di transazioni firmate e verificate utilizzando la crittografia e una coppia di chiavi pubbliche/private. Di fatto, nei sistemi blockchain le chiavi private servono come credenziali di proprietà. La loro perdita o l'esposizione a seguito di un incidente o di un furto hanno già comportato ingenti perdite di criptovaluta. Per questo motivo, la sicurezza delle chiavi private riveste un'importanza fondamentale nell'implementazione di applicazioni blockchain.

I precedenti approcci basati sul software o su una sicurezza hardware limitata possono lasciare le chiavi private vulnerabili a un'ampia gamma di attacchi. Nei controller di sicurezza progettati con una profonda protezione contro minacce dirette e indirette di vario tipo sono invece incorporate soluzioni più robuste. Servendosi di una soluzione basata su questo tipo di controller di sicurezza, lo starter kit Blockchain Security 2Go (BLOCKCHAINSTARTKITTOBO1) di Infineon offre la protezione profonda richiesta per la sicurezza della blockchain.

Invece di cimentarsi con le sfide derivanti dall'implementazione di soluzioni proprie, gli sviluppatori possono fornire agli utenti delle smart card senza contatto con integrato il supporto per i meccanismi di sicurezza della blockchain, compresa la firma delle transazioni che rappresenta il primo passo critico nell'estensione di una blockchain (Figura 1).

Schema della smartcard Blockchain Security 2Go di InfineonFigura 1: La smart card Blockchain Security 2Go di Infineon semplifica l'implementazione della sicurezza della blockchain con supporto integrato per i suoi meccanismi, compresa la firma delle transazioni utilizzata per estendere una blockchain. (Immagine per gentile concessione di Infineon Technologies)

Piattaforma sicura

Lo starter kit Blockchain Security 2Go di Infineon fornisce agli integratori di sistemi blockchain una soluzione di sicurezza chiavi in mano che elimina la necessità di accordi di non divulgazione tipicamente richiesti per l'acquisizione di dispositivi di sicurezza.

Progettato per una rapida implementazione grazie al software open-source di Infineon, il kit include cinque smart card che implementano meccanismi di blockchain con chiave che includono la generazione di chiavi sicure, la creazione della firma e l'autenticazione del PIN. Il pacchetto correlato di 10 carte Security 2Go (BLOCKCHAIN10CARDSTOBO1) di Infineon è per gli sviluppatori un'ulteriore fonte di approvvigionamento di queste smart card.

Le carte sono conformi allo standard ISO/IEC 7810 ID-1 utilizzato in alcune aree per le carte di pagamento convenzionali e le carte d'identità. Per la connettività, le smart card integrano un'antenna di Classe 1 basata su ISO/IEC 14443 per le carte senza contatto che utilizzano la comunicazione near-field (NFC).

Il controller di sicurezza embedded in ogni carta fornisce una sicurezza basata su hardware per creare e memorizzare fino a 255 coppie di chiavi private/pubbliche ed eseguire algoritmi di crittografia. Oltre a un generatore di numeri casuali reali (TRNG) integrato, le carte supportano algoritmi sia per la crittografia simmetrica utilizzando AES (Advanced Encryption Standard) a 256 bit che per quella asimmetrica utilizzando ECC (crittografia a curva ellittica) a 256 bit, precaricata con la curva ECC secp256k1 tipicamente utilizzata nelle criptovalute, incluse Bitcoin ed Ethereum.

Grazie al supporto dedicato per i meccanismi di sicurezza della blockchain, le carte forniscono una soluzione immediata per proteggere le transazioni blockchain. Invece di dedicare tempo a costruire metodi di firma sicuri, gli integratori di sistemi blockchain possono semplicemente dare agli utenti delle smart card da utilizzare quando interagiscono con il sistema blockchain distribuito.

Interazioni più semplici

Per gli utenti, le smart card sono un metodo semplice per eseguire transazioni blockchain e, allo stesso tempo, proteggere le proprie chiavi private. Le carte sono progettate per funzionare con il software in esecuzione su un dispositivo di interfaccia, come uno smartphone NFC o un computer dotato di un lettore di smart card NFC standalone. Durante l'esecuzione dell'applicazione blockchain, gli utenti attivano le funzioni della carta appoggiandola sul dispositivo di interfaccia (Figura 2).

Immagine del lettore NFC sul retro di uno smartphone Google PixelFigura 2: Gli utenti richiamano la funzionalità della smart card avvicinandola all'antenna del lettore NFC, ad esempio l'area lucida sul retro di uno smartphone Google Pixel, come mostrato qui. (Immagine per gentile concessione di Infineon Technologies)

Per la valutazione immediata delle smart card Security 2Go, Infineon fornisce un'app per dispositivi mobili Android che ne dimostra l'utilizzo in scenari tipici. Dopo essere stata lanciata su uno smartphone con capacità NFC, l'app invita l'utente a mettere la carta a contatto con l'area dell'antenna NFC dello smartphone, abilitando così l'interfaccia completa dell'app per dispositivi mobili (Figura 3).

Immagini di Coinfinity GmbH per lo starter kit Blockchain Security 2GoFigura 3: L'app Android pre-costruita sviluppata da Coinfinity GmbH per lo starter kit Blockchain Security 2Go mostra come, dopo la richiesta di contatto con la smart card (a sinistra), ne utilizza le caratteristiche per dimostrare vari scenari d'uso (a destra). (Immagine per gentile concessione di Infineon Technologies)

Dietro le quinte di questa app per dispositivi mobili e altre distribuzioni, il software in esecuzione sullo smartphone o su altri dispositivi di interfaccia invia dei comandi per eseguire funzioni come la generazione di una nuova coppia di chiavi o l'ottenimento di informazioni su una coppia di chiavi esistenti. In tutte queste e altre sequenze di comando, la chiave privata non esce mai dalla smart card. In risposta a comandi che interessano chiavi private, al massimo la smart card restituisce al dispositivo di interfaccia un handle della chiave. Da parte sua, il software del dispositivo di interfaccia utilizza l'handle per eseguire comandi correlati come il recupero della chiave pubblica abbinata a una particolare chiave privata (Figura 4).

Tramite questo approccio, il software in esecuzione sull'interfaccia può completare le operazioni richieste per interagire con il sistema blockchain senza compromettere i dati segreti.

Schema della richiesta di generazione della chiave a una smart card Blockchain Security 2Go di InfineonFigura 4: Un dispositivo di interfaccia come uno smartphone o un lettore di smart card invia comandi come questa richiesta di generazione della chiave a una smart card Blockchain Security 2Go di Infineon, che crea una coppia di chiavi private/pubbliche e restituisce quella pubblica senza rivelare quella privata. (Immagine per gentile concessione di Infineon Technologies)

Il software del dispositivo di interfaccia mantiene la responsabilità di eseguire funzioni specifiche per l'applicazione, come la trasformazione della chiave pubblica nell'indirizzo della blockchain (tipicamente univoco) utilizzato per ogni transazione. Ad esempio, un indirizzo Bitcoin utilizza la chiave pubblica come input per un algoritmo di hashing unidirezionale. Viene così generato un indirizzo che dipende dalla chiave pubblica ma che non può essere utilizzato per ricrearla.

In modo analogo, per firmare una richiesta di transazione, l'interfaccia invia alla smart card un comando e il risultato hash correlato. In risposta, la smart card restituisce la firma al dispositivo di interfaccia (Figura 5).

Schema della firma della smart card Blockchain Security 2Go di InfineonFigura 5: La firma di una transazione richiede l'uso di una chiave privata, ma con la smart card Blockchain Security 2Go di Infineon il dispositivo di interfaccia riceve la firma senza che sia esposta l'importantissima chiave privata. (Immagine per gentile concessione di Infineon)

Application Protocol Data Unit

Per ogni comando e ogni risposta, un dispositivo di interfaccia e la smart card interagiscono utilizzando le Application Protocol Data Unit (APDU), definite nella parte 4 dello standard ISO/IEC 7816. Per ogni interazione con la smart card, il dispositivo di interfaccia invia richieste di servizio nel formato APDU di comando dello standard ISO/IEC-7816 e riceve risposte (opzionali) nel formato APDU di risposta dello standard (Figura 6).

Tabella dei formati dello standard ISO/IEC 7816 per APDU di comando e APDU di rispostaFigura 6: I formati dello standard ISO/IEC 7816 per APDU di comando e APDU di risposta sono la base delle comunicazioni tra i dispositivi di interfaccia e le smart card conformi come Blockchain Security 2Go di Infineon. (Immagine per gentile concessione di Infineon Technologies)

All'interno di un'APDU di comando, le istruzioni e i parametri supportati sono definiti dal fornitore della smart card in conformità con gli standard del settore utilizzati nell'area dell'applicazione di destinazione. Per le smart card Blockchain Security 2Go, Infineon definisce una serie fondamentale di comandi necessari per sfruttarne le funzionalità (Tabella 1).

Tabella del set di comandi per la smart card Blockchain Security 2Go di InfineonTabella 1: Set di comandi per la smart card Blockchain Security 2Go di Infineon. (Tabella creata da DigiKey sulla base di dati gentilmente forniti da Infineon Technologies)

Ad esempio, per avviare una nuova sessione, il software del dispositivo di interfaccia costruisce l'APDU di comando SELECT APPLICATION con un valore di dati per l'identificativo fisso dell'applicazione (AID, Fixed Application Identifier) fornito da Infineon per lo starter kit Blockchain Security 2Go. Dopo aver ricevuto quell'APDU di comando, la smart card si inizializza per una nuova sessione e trasmette la corrispondente APDU di risposta, che include alcuni metadati della smart card (Figura 7).

Tabella dei valori di campo di APDU specifici di Infineon necessari per i comandiFigura 7: Per la smart card Blockchain Security 2Go, Infineon fornisce i valori di campo di APDU specifici necessari per i comandi e previsti nelle risposte e nei codici di errore come questo set per l'inizializzazione della smart card, che include l'identificativo fisso dell'applicazione (AID) fornito da Infineon. (Immagine per gentile concessione di Infineon Technologies)

Software personalizzato

Gli sviluppatori non devono lavorare a questo basso livello per creare nuove applicazioni utilizzando le smart card Blockchain Security 2Go. Nel repository GitHub di Blockchain Security 2Go, Infineon fornisce applicazioni di esempio e documentazione sull'uso delle smart card.

Infineon include il codice sorgente Java completo per l'app per dispositivi mobili Android nel repository GitHub di codice Android per BlockchainSecurity2Go. Studiando questa base di codice, i programmatori software possono imparare rapidamente i modelli di progettazione chiave, compreso come inizializzare una sessione smart card (selectApplication()), leggere una chiave pubblica da una smart card (readPublicKeyFromCard()) e creare una nuova coppia di chiavi (generateNewSecp256K1Keypair()) nel caso in cui nella carta non esista già una chiave pubblica (Listato 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;
            }
        }
    }

Listato 1: Infineon fornisce il codice sorgente completo per l'app per Android Blockchain Security 2Go, che dimostra interazioni di base come la lettura di una chiave pubblica o la creazione di una nuova coppia di chiavi private/pubbliche. (Codice per gentile concessione di Infineon Technologies)

Le classi di utility nella base del codice Java implementano interazioni dettagliate come la creazione dell'APDU SELECT APPLICATION. Le routine che richiamano la funzione membro mostrata nel Listato 2 (sotto) passano un parametro aid che contiene l'AID Blockchain Security 2Go di Infineon, dichiarato precedentemente nel pacchetto come segue:

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;
    }
 
}

Listato 2: La distribuzione della sorgente dell'app per Android Blockchain Security 2Go di Infineon illustra la creazione di un'APDU di comando per inizializzare la smart card. (Codice per gentile concessione di Infineon Technologies)

Per sveltire lo sviluppo, Infineon fornisce anche una libreria Python per Blockchain Security 2Go e un'interfaccia a riga di comando basata su questa libreria. Come per la versione Java, il codice Python dimostra il semplice modello di progettazione richiesto per eseguire operazioni con la smart card come la generazione di una coppia di chiavi (Listato 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):
    """ 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

Listato 3: La libreria Python per Blockchain Security 2Go di Infineon e la relativa interfaccia a riga di comando agevolano lo sviluppo con una serie completa di routine di servizio come la funzione select_app() per inizializzare una smart card Blockchain Security 2Go e generate_keypair(), ognuna delle quali dimostra i modelli di progettazione base per l'interazione con la smart card. (Codice per gentile concessione di Infineon Technologies)

Come è tipico di Pythonic, la libreria Python per Blockchain Security 2Go si basa su moduli di terze parti facilmente reperibili. In particolare, la libreria Infineon utilizza il famoso modulo pyscard, includendone le funzioni nella propria definizione di classe. Ad esempio, la libreria Python per Blockchain Security 2Go inizia una sessione smart card trovando un lettore personal computer/smart card (PC/SC). Nel caso di blocksec2go, il modulo principale della libreria Python per Blockchain Security 2Go, per trovarlo si utilizza open_psycard(), che è una funzione membro di una classe della libreria che contiene le funzioni pyscard (Listato 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)

Listato 4: La libreria Python per Blockchain Security 2Go di Infineon contiene le interazioni con il modulo pyscard di terze parti in questa classe, utilizzandone le funzioni membro per richiamare le funzioni pyscard. (Codice per gentile concessione di Infineon Technologies)

Conclusione

La tecnologia blockchain offre una struttura che allarga l'accessibilità alle informazioni senza comprometterne l'integrità o l'autenticità. Invece di affidarsi a un'autorità centrale, un sistema blockchain utilizza la crittografia per verificare le transazioni e proteggerle da modifiche. Le chiavi private, elemento cardine di questo approccio, non possono prescindere da solidi meccanismi di sicurezza per prevenire la perdita di controllo delle transazioni degli utenti e la compromissione del sistema blockchain.

Come è stato dimostrato, lo starter kit Blockchain Security 2Go di Infineon e il relativo software open-source forniscono agli integratori di sistemi blockchain una soluzione di sicurezza immediata e agli utenti offrono un metodo più semplice e sicuro per eseguire transazioni blockchain.

DigiKey logo

Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.

Informazioni su questo autore

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk ha più di 20 anni di esperienza come autore sull'industria elettronica e ha scritto su una vasta gamma di argomenti tra cui hardware, software, sistemi e applicazioni, incluso l'IoT. Ha ricevuto un Ph.D. in neuroscienze sulle reti neuronali e ha lavorato nel settore aerospaziale su sistemi di sicurezza ampiamente distribuiti e sui metodi di accelerazione algoritmica. Attualmente, quando non scrive articoli su tecnologia e ingegneria, lavora su applicazioni di deep learning per i sistemi di riconoscimento e di raccomandazione.

Informazioni su questo editore

Editori nordamericani di DigiKey