Autore Topic: Criptare file in un app  (Letto 1379 volte)

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Criptare file in un app
« il: 18 Marzo 2013, 15:58:07 CET »
0
Buon pomeriggio =)
Sto sviluppando un applicazione che deve conservare dei dati sensibili (password) però devo poterli reperire facilmente dalla mia app per poterli usare...
Qualcuno sà se in android c'è una qualche funzione di default per criptare file?
Una soluzione potrebbe essere cambiare i permessi...ma....
« Ultima modifica: 18 Marzo 2013, 16:16:06 CET da Ricky` »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Criptare file in un app
« Risposta #1 il: 18 Marzo 2013, 16:17:30 CET »
0
Se decidi di usare le shared preferences:

https://github.com/sveinungkb/encrypted-userprefs


Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Criptare file in un app
« Risposta #2 il: 18 Marzo 2013, 16:28:46 CET »
0
Devo salvare oggetti con dati sensibili...cmq spulciando in java ho trovato qualcosa che fa al caso mio(criptare e decriptare stringhe)...usa l'algoritmo "AES128"..il risultato..il file sarà visibile è in Ascii-econded (esadeciamle e no base 64)..certo almeno un MINIMO di sicurezza!!
Eccovi qui l'esempio
Codice (Java): [Seleziona]
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class StringCrypto {

    public static String encrypt(String seed, String cleartext) throws Exception {
            byte[] rawKey = getRawKey(seed.getBytes());
            byte[] result = encrypt(rawKey, cleartext.getBytes());
            return toHex(result);
    }
   
    public static String decrypt(String seed, String encrypted) throws Exception {
            byte[] rawKey = getRawKey(seed.getBytes());
            byte[] enc = toByte(encrypted);
            byte[] result = decrypt(rawKey, enc);
            return new String(result);
    }

    private static byte[] getRawKey(byte[] seed) throws Exception {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            sr.setSeed(seed);
        kgen.init(128, sr); // 192 and 256 bits may not be available
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();
        return raw;
    }

   
    private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(clear);
            return encrypted;
    }

    private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
            return decrypted;
    }

    public static String toHex(String txt) {
            return toHex(txt.getBytes());
    }
    public static String fromHex(String hex) {
            return new String(toByte(hex));
    }
   
    public static byte[] toByte(String hexString) {
            int len = hexString.length()/2;
            byte[] result = new byte[len];
            for (int i = 0; i < len; i++)
                    result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
            return result;
    }

    public static String toHex(byte[] buf) {
            if (buf == null)
                    return "";
            StringBuffer result = new StringBuffer(2*buf.length);
            for (int i = 0; i < buf.length; i++) {
                    appendHex(result, buf[i]);
            }
            return result.toString();
    }
    private final static String HEX = "0123456789ABCDEF";
    private static void appendHex(StringBuffer sb, byte b) {
            sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
    }
   
}
« Ultima modifica: 18 Marzo 2013, 16:41:26 CET da MisterAnt »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Criptare file in un app
« Risposta #3 il: 18 Marzo 2013, 16:46:18 CET »
0
Devo salvare oggetti con dati sensibili...cmq spulciando in java ho trovato qualcosa che fa al caso mio(criptare e decriptare stringhe)...usa l'algoritmo "AES128"..il risultato..il file sarà visibile è in Ascii-econded (esadeciamle e no base 64)..certo almeno un MINIMO di sicurezza!!
Codice (Java): [Seleziona]
    private static byte[] getRawKey(byte[] seed) throws Exception {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            sr.setSeed(seed);
        kgen.init(128, sr); // 192 and 256 bits may not be available
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();
        return raw;
    }

   
}

Attenzione all'utilizzo di SecureRandom.
 // Do *not* seed secureRandom! Automatically seeded from system entropy.

Riporto un articolo apparso sul blog ufficiale di android Developers
Using Cryptography to Store Credentials Safely | Android Developers Blog

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Criptare file in un app
« Risposta #4 il: 18 Marzo 2013, 17:13:12 CET »
0
Mi correggo...occhio alla versione che utilizzate..dalla 4.2 in poi la classe SecureRandom non funge correttamente perchè restituisce sempre lo stesso valore...quindi addio security sight :(
« Ultima modifica: 18 Marzo 2013, 17:29:52 CET da MisterAnt »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline wlf

  • Utente normale
  • ***
  • Post: 335
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Criptare file in un app
« Risposta #5 il: 24 Settembre 2014, 17:16:55 CEST »
0
Stavo testando il codice per la encrypt/decrypt in AES. Forse sono io che ne ho frainteso l'utilizzo, ma se cerco di criptare e decriptare passando due stringhe, una per la password e l'altra il testo da criptare, mi continua a dare errore"javax.crypto.BadPaddingException: pad block corrupted"

Utilizzo:
Codice: [Seleziona]
String encrypt = StringCrypto .encrypt("prova", "Provina");
String decrypt = StringCrypto .decrypt("prova", encrypt);

Anche passandogli due stringe esadecimali non funziona ...
Sospetto che funzioni solo con dei byte, ma non ho testato. Non mi spiego però perché da codice sia previsto anche con le stringhe ...
Sono io che sbaglio qualche presupposto? Grazie.
« Ultima modifica: 24 Settembre 2014, 17:23:31 CEST da wlf »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Criptare file in un app
« Risposta #6 il: 24 Settembre 2014, 19:03:15 CEST »
+1
Ho trovato questa soluzione su google inserendo l'exception che ti esce:
javax.crypto.BadPaddingException: pad block corrupted | Android Addicted Apps Creator

Potrebbe bastare cambiare una riga del codice in questa (la trovi facilmente è quasi uguale):
Codice (Java): [Seleziona]
SecureRandom rand = SecureRandom.getInstance( "SHA1PRNG", "Crypto" );
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline wlf

  • Utente normale
  • ***
  • Post: 335
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Criptare file in un app
« Risposta #7 il: 26 Settembre 2014, 12:53:55 CEST »
0
Ho trovato questa soluzione su google inserendo l'exception che ti esce:
javax.crypto.BadPaddingException: pad block corrupted | Android Addicted Apps Creator

Potrebbe bastare cambiare una riga del codice in questa (la trovi facilmente è quasi uguale):
Codice (Java): [Seleziona]
SecureRandom rand = SecureRandom.getInstance( "SHA1PRNG", "Crypto" );

Bingo! ;)
Infatti con la modifica suggerita adesso riesco a cryptare e decryptare correttamente. Però mi è sorto un dubbio; la stringa criptata non dovrebbe essere diversa tutte le volte che faccio la criptazione della stessa stringa in chiaro? Teoricamente grazie ad una funzione random dovrebbe essere diversa tutte le volte e logicamente con la password si riuscirebbe comunque a risalire sempre alla stringa in chiaro partendo da quella criptata ...
E' così come mi sembra di aver capito oppure ho preso un abbaglio? :)