2. Android Security
Key Management
Roberto Piccirillo
Senior Security Analyst - Mobile Security Lab
Vulnerability Assessment (IT, Mobile Application)
Hijacking Mobile Data Connection
BlackHat Europe 2009
DeepSec Vienna 2009
HITB Amsterdam 2010
Android Secure Development
@robpicone
3. Android Security
Key Management
Roberto Gassir
Senior Security Analyst - Mobile Security Lab
Vulnerability Assessment (IT, Mobile Application)
Hijacking Mobile Data Connection
BlackHat Europe 2009
DeepSec Vienna 2009
HITB Amsterdam 2010
Android Secure Development
IpTrack Developer
@robgas
4. Android Security
Key Management
Agenda
Key Management e CryptoSystem
Mobile Application: protezione dei dati
Key Management in Android e sue evoluzioni
Keychain e AndroidKeyStore
Tipologie di AndroidKeyStore
Codelab
Generazione chiave pubblica/privata
Accesso AndroidKeyStore
Digital signature e Encryption
6. Android Security
Key Management
CryptoSystem
"refers to a suite of algorithms needed to implement
a particular form of encryption and decryption"
Tipologie di encryption:
Symmetric Key Algorithms
Identical encryption key for
encryption/decryption
Asymmetric Key Algorithms
Different key for encryption/decryption
7. Android Security
Key Management
In app?
Protezione dati riservati
Dati dell'applicazione
Dati su /sdcard
Chiavi di cifratura
Scambio sicuro di dati
Documento
Mail
SMS
Chiave di sessione
Firma digitale
Documento
Mail
9. Android Security
Key Management
Key Management in Android
"User" level
PBKDF2 (Password Based Key Derivation Function)
Algoritmo di generazione ( PBEWithSHA256And256BitAES-CBC-BC )
Salt
Numero di Iterazioni
System Level
KeyChain (da >= 4.0 )
AndroidKeyStore (ufficiale da >= 4.3)
10. Android Security
Key Management
KeyChain e AndroidKeyStore
KeyChain
Accessibile da qualunque applicazione
AndroidKeyStore
Accessibile alla singola applicazione ed al singolo utente
Memorizza solo coppia chiave pubblica/privata RSA 2048
11. Android Security
Key Management
Key Management Evolution
API LEVEL 14 API LEVEL 18
Global Level:
KeyChain
( Public API )
App Level:
KeyStore
( Closed API )
Global Level Only:
Default TrustStore
cacerts.bks
(ROOTED device)
Global Level:
KeyChain
( Public API )
App Level and
per User Level:
AndroidKeyStore
( Public API )
12. Android Security
Key Management
AndroidKeyStore Storage
Due tipologie di Storage
Hardware-backed (Nexus 7, Nexus
4, Nexus 5 :-) con OS >= 4.3)
Secure Element
TPM
TrustZone
Software only (Rimanenti dispositivi
con OS >= 4.3)
15. Android Security
Key Management
Cosa faremo
CodeLab diviso in 4 step:
1.Generazioni Chiavi
2.Accesso AndroidKeyStore
3.Firma e Verifica
4.Cifratura/Decifratura
16. Android Security
Key Management
Definizione Specifiche Certificato
Context cx = getActivity();
String pkg = cx.getPackageName();
Calendar notBefore = Calendar.getInstance();
Calendar notAfter = Calendar.getInstance();
notAfter.add(1, Calendar.YEAR);
import android.security.KeyPairGeneratorSpec.Builder;
Builder builder = new KeyPairGeneratorSpec.Builder(cx);
builder.setAlias(DEVKEY1);
String infocert = String.format("CN=%s, OU=%s", DEVKEY1, pkg);
builder.setSubject(new X500Principal(infocert));
builder.setSerialNumber(BigInteger.ONE);
builder.setStartDate(notBefore.getTime());
builder.setEndDate(notAfter.getTime());
KeyPairGeneratorSpec spec = builder.build();
Definizione Paramentri
Temporali
Self-Signed X.509
Common Name (CN)
Subject (OU)
Serial Number
Generazione delle specifiche del
Certificato
ALIAS per indicizzare
il certificato
17. Android Security
Key Management
Generazione chiave pubblica/privata
KeyPairGenerator kpGenerator;
kpGenerator = KeyPairGenerator
.getInstance("RSA", "AndroidKeyStore");
kpGenerator.initialize(spec);
KeyPair kp;
kp = kpGenerator.generateKeyPair();
Engine per generazione
chiave Privata/Pubblica
Istanza Engine con:
Algoritmo RSA
Provider: AndroidKeyStore
Init Engine con le specifiche del certificato
Dopo la generazione, le chiavi saranno memorizzate in
Android Key Store e potranno essere recuperate mediante lALIAS
Generazione chiave Privata/Pubblica
18. Android Security
Key Management
Abbiamo il riferimento keyStore che utilizzeremo per
accedere alla coppia chiave Pubblica/Privata mediante
lidentificativo ALIAS
Dovrebbe essere utilizzato nel caso si ha un
InputStream da caricare (per esempio il nome di un
KeyStore importato). Se non invocato lapplicazione
andr in CRASH
Inizializzazione Android Key Store
keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
Richiesta di Android Key Store
19. Android Security
Key Management
RSA Digital Signature
Digital Signature
Authentication, Non-Repudiation and Integrity
RSA Private key to Sign
RSA Public Key to Verify
KeyStore.Entry entry = ks.getEntry(DEVKEY1, null);
byte[] data = DevFest Rome 2013!.getBytes();
Signature s = Signature.getInstance(SHA256withRSA);
s.initSign(((KeyStore.PrivateKeyEntry) entry).getPrivateKey());
s.update(data);
byte[] signature = s.sign();
String result = null;
result = Base64.encodeToString(signature, Base64.DEFAULT);
Accesso chiave Pubblica e Privata
identificata dallALIAS==DEVKEY1
Scelta dellalgoritmo
Chiave Privata per firmare
Firma e codifica in
Base64
20. Android Security
Key Management
Verify RSA Digital Signature
byte[] data = input.getBytes();
byte[] signature;
signature = Base64.decode(signatureStr, Base64.DEFAULT);
KeyStore.Entry entry = ks.getEntry(DEVKEY1, null);
Signature s = Signature.getInstance("SHA256withRSA");
s.initVerify(((KeyStore.PrivateKeyEntry) entry).getCertificate());
s.update(data);
boolean valid = s.verify(signature);
Decodifica Base64
Accesso chiave Pubblica e Privata
identificata dallALIAS==DEVKEY1
Scelta dellalgoritmo
Chiave Pubblica nel
certificato utilizzata per
verificare
TRUE == Verified
FALSE== Not Verified
21. Android Security
Key Management
RSA Encryption
Encryption
Confidentiality
RSA Public key to Encrypt
RSA Private key to Decrypt
PublicKey publicKeyEnc = ((KeyStore.PrivateKeyEntry) entry)
.getCertificate().getPublicKey();
String textToEncrypt = new String("DevFest Rome 2013");
byte[] textToEncryptToByte = textToEncrypt.getBytes();
Cipher encCipher = null;
byte[] encryptedText = null;
encCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
encCipher.init(Cipher.ENCRYPT_MODE, publicKeyEnc);
encryptedText = encCipher.doFinal(textToEncryptToByte);
Accesso alla chiave
pubblica per cifrare
Scelta algoritmo
Encryption con chiave
pubblica
Testo Cifrato
23. Android Security
Key Management
Si osserva che...
Vari tipi di screen lock
La scelta di screen lock
impatta sulla persistenza
delle chiavi generate
Cambiando il tipo di screen
lock le chiavi vengono
cancellate