Crittografia su Android

Crittografia su Android

La crittografia è il processo di conversione del testo in chiaro ordinario in testo incomprensibile, noto anche come testo cifrato. Quindi i dati possono essere archiviati o trasmessi in una forma particolare e solo coloro a cui sono destinati possono leggerli ed elaborarli. La crittografia protegge i dati da furti o alterazioni, ma è anche utile per l’autenticazione degli utenti.

La crittografia moderna esiste attraverso la combinazione di processi di sicurezza avanzati che utilizzano metodi di crittografia complessi per codificare i messaggi in modo che solo le parti autorizzate possano vederli. Il testo in chiaro viene convertito in testo cifrato utilizzando un algoritmo di crittografia che genera una chiave di crittografia . Quindi il destinatario deve utilizzare una chiave di decrittazione per trasformare di nuovo il testo cifrato in testo in chiaro.

Flusso di crittografia

Plain data ->Algorithm (Symmetric, Asymmetric, Hash functions) -> Key (Secret Key, Private Key, Public Key)-> Cipher data



Tipi di crittografia

  1. Crittografia simmetrica
    Questo metodo utilizza una chiave singola sia per la crittografia che per la decrittografia. Dopo che il mittente crittografa il testo in chiaro utilizzando questa chiave, invia il testo cifrato al destinatario. Quindi il destinatario applica la stessa chiave per decrittografare il testo cifrato e recuperare il testo in chiaro.

Esempi: AES (Advanced Encryption Standard), DES (Data Encryption Standard) e IDEA (International Data Encryption Algorithm).

Inoltre, è generalmente classificato come cifrario a flusso o cifrario a blocchi . Tuttavia, uno dei rischi della crittografia a chiave simmetrica è che, se la chiave privata condivisa viene compromessa, l’intero sistema per la protezione dei dati viene compromesso.

Cifratura a flusso : una tecnica crittografica simmetrica in cui converte il testo in chiaro in testo cifrato prendendo byte per byte il testo in chiaro. ChaCha e RC4 sono gli algoritmi di cifratura a flusso più ampiamente utilizzati.

Cifratura a blocchi : una tecnica crittografica simmetrica che converte il testo in chiaro in testo cifrato come blocchi di dimensioni fisse. Di solito, la dimensione del testo in chiaro supera la dimensione di un blocco. Pertanto, il testo in chiaro viene suddiviso in un numero di blocchi sequenziali e la cifratura opera su questi blocchi uno alla volta.

I cifrari a blocchi sono più complessi, versatili e robusti dei cifrari a flusso, in quanto possono supportare diverse modalità di funzionamento e padding. AES (Advanced Encryption Standard) e DES (Data Encryption Standard) sono esempi di algoritmi di cifratura a blocchi.

  1. Crittografia asimmetrica
    La crittografia asimmetrica aiuta a eliminare il problema della condivisione delle chiavi generando due chiavi diverse: una chiave privata e una pubblica. Questa è nota come crittografia a chiave pubblica e utilizza una chiave pubblica per crittografare il testo in chiaro, mentre la chiave privata decrittografa il testo cifrato.

Ad esempio, pensiamo alla chiave pubblica come alla chiave della nostra casella di posta. Apre la casella di posta solo per depositare lettere. Possiamo condividere questa chiave con chiunque ci invii lettere. Così possono depositare le lettere nella nostra casella di posta e solo noi abbiamo la chiave privata, che usiamo per far uscire le lettere.

Esempi: RSA (Rivest Shamir Adleman) è considerato uno degli algoritmi di crittografia a chiave asimmetrica più sicuri.

  1. Funzioni hash
    Questo metodo utilizza un algoritmo di crittografia unidirezionale per crittografare il testo in chiaro in testo cifrato. I valori restituiti da una funzione hash sono chiamati digest di messaggio o valori hash. È impossibile ripristinare un valore hash in testo in chiaro e non ci sono due testi in chiaro che produrranno lo stesso hash per una data funzione hash.
    Esempi : SHA-1, SHA-224, SHA-256, SHA-384 e SHA-512

Tipi di chiave
Chiave segreta: una chiave singola utilizzata nella crittografia simmetrica per crittografare e decrittografare un messaggio.

Chiave pubblica : componente pubblica delle chiavi crittografiche utilizzate per la crittografia nella crittografia asimmetrica .

Chiave privata : componente segreta delle chiavi crittografiche utilizzata per la decrittazione nella crittografia asimmetrica .

Modalità di crittografia e riempimento
Modalità — descrive come i diversi blocchi di un testo in chiaro multi-blocco devono essere crittografati e decrittografati. Ci sono 5 modalità di funzionamento, come Electronic CodeBook ( ECB ), Cipher Block Chaining ( CBC ), Cipher feedback ( CFB ), Output Feedback ( OFB ), Counter Mode ( CTR ).

Padding : alcune modalità (come ECB e CBC) richiedono che il blocco finale venga riempito prima della crittografia.

Crittografia su Android
Questo processo si basa sulla Java Cryptography Architecture ( JCA ), che separa le interfacce e l’implementazione. È possibile includere diversi provider di sicurezza che possono implementare set di algoritmi crittografici. La maggior parte delle interfacce e delle classi JCA sono definite in Java.security.

Questo documento descrive come eseguire la crittografia a chiave simmetrica utilizzando l’ algoritmo AES (Advanced Encryption Standard)

Trasformazione
Algoritmo — AES (Advanced Encryption Standard)

Modalità — CBC ( Cipher Block Chaining)

Paddings — PKCS7Padding

Nota : in modalità CBC, viene utilizzato un vettore di inizializzazione ( IV ) per evitare che lo stesso testo in chiaro risulti nello stesso testo cifrato.

Chiave segreta
Per eseguire la crittografia e la decrittografia, è necessaria una chiave segreta simmetrica. È possibile utilizzare un valore stringa di 16, 24 o 32 byte oppure generarne uno tramite un generatore di chiavi.

Utilizzo di una chiave personalizzata

val keyTxt= "MyEncryptionKey1" // 16, 24 o 32 byte per AES-128, AES-192 o AES-256
				val encKey = URLEncoder.encode(keyTxt, "UTF-8" )
				val key = SecretKeySpec(encKey.toByteArray(), "AES" )


  1. Utilizzo del generatore di chiavi
val keygen = KeyGenerator.getInstance( "AES" )
				keygen. init ( 128 ) //La dimensione della chiave deve essere 128, 192 o 256 bit
				val key: SecretKey = keygen.generateKey()


CrittografiaCrittografia su Android

val textToEncrypt = "This is a sample text"
				
				//use CBC mode and PKCS7Padding as padding"
				val cipher = Cipher.getInstance( "AES/CBC/PKCS7Padding" )
				cipher. init (Cipher.ENCRYPT_MODE, key)
				
				val iv: ByteArray = cipher.iv
				val ivSpec = IvParameterSpec(iv)
				
				val encryted_bytes = cipher.doFinal(textToEncrypt.toByteArray())
				val encode_bytes: ByteArray = Base64.encode(encryted_bytes, Base64.DEFAULT)
				
				val encryptedTxt = String(encode_bytes, Charset.forName( "UTF-8" ))


				
				


Decifrazione

//use same transformation that used to encrypt
				val cipher = Cipher.getInstance( "AES/CBC/PKCS7Padding" )
				cipher. init (Cipher.DECRYPT_MODE, key,ivSpec )
				
				val encryted_bytes: ByteArray = Base64.decode(encryptedTxt, Base64.DEFAULT)
				val decrypted_bytes = cipher.doFinal(encryted_bytes)
				
				val decryptedTxt = String(decrypted_bytes, Charset.forName( "UTF-8" ))



Memorizza la chiave segreta in AndroidKeystoreCrittografia su Android
Dopo aver generato una chiave segreta, dovremmo conservarla in un luogo sicuro. Ma conservare le chiavi segrete nelle preferenze condivise o salvarle in un file non è una buona pratica. Se il tuo APK viene compromesso, le chiavi possono essere esposte.

La soluzione è quella di archiviare le chiavi nel sistema Keystore di Android , che fornisce un contenitore sicuro per archiviare le chiavi crittografiche. Questo sistema assicura che le chiavi siano crittografate e archiviate in modo sicuro, impedendo al contempo l’accesso non autorizzato. Anche se il tuo APK viene compromesso, le chiavi rimangono sicure.

Di seguito ho menzionato il processo di memorizzazione di una chiave segreta utilizzando AndroidKeystore :

val alias = "secretKeyAlias"
				val keyStore = KeyStore.getInstance( "AndroidKeyStore" )
				​​keyStore.load( null )
				
				val protParam = KeyProtection
				.Builder(KeyProperties.PURPOSE_ENCRYPT o KeyProperties.PURPOSE_DECRYPT)
				.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
				.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
				.build()
				// salva la chiave segreta
				val skEntry = KeyStore.SecretKeyEntry(chiave)
				keyStore.setEntry(alias, skEntry, protParam)


Recupera la chiave segreta
Dopo aver memorizzato la chiave in AndroidKeystore , puoi recuperarla facilmente per crittografarla e decrittografarla.

val alias = "secretKeyAlias"
				val keyStore = KeyStore.getInstance( "AndroidKeyStore" )
				​​keyStore.load( null )
				val key = keyStore.getKey(alias, null ) come SecretKey


Ora abbiamo imparato a crittografare i dati usando la crittografia simmetrica con l’ algoritmo AES e a memorizzare le chiavi segrete in modo sicuro in AndroidKeyStore . Inoltre, ci sono molti algoritmi disponibili per la crittografia. Quindi, potete provare anche quelli.

(fonte)

Innovaformazione, scuola informatica specialistica promuove la cultura del “secure coding” e dello sviluppo android con approccio consapevole. Su queste tematiche trovate i seguenti corsi di formazione rivolti ad aziende:

Corso OWASP sicurezza web app

Corso Android sviluppatore app

INFO: info@innovaformazione.net – tel. 3471012275 (Dario Carrassi)

Vuoi essere ricontattato? Lasciaci il tuo numero telefonico e la tua email, ti richiameremo nelle 24h:

    Ti potrebbe interessare

    Articoli correlati