VOCÊ ESTÁ EM: Home > Radar > Dica do Dia > Android Development – Criptografia baseada em Senha
Android Development – Criptografia baseada em Senha
07/10/2014

androiddev-300x157111

O sistema Android não possui nativamente uma Intent ou qualquer função pronta de criptografia. Para protegermos determinado trecho de informação, precisamos utilizar as classes de criptografia da linguagem JAVA ou mesmo alguma biblioteca de terceiros.

De qualquer forma, falar de criptografia é sempre um assunto um tanto complexo e trabalhoso e um tanto pior quando precisamos utilizar algoritmos simétricos onde a chave de criptografia usada para proteger o dado é a mesma usada para desproteger. O problema reside em “onde guardar essa chave”.

Um meio prático de fazer isto é compor a chave a partir de algo que apenas o usuário ou dono da informação tenha. O mais trivial é basear a composição da chave na senha do usuário. No exemplo que daremos, você terá dois métodos (um para proteger e outro para desproteger) qualquer texto em sua aplicação e cuja chave (gerada sempre quando o método for usado) será baseada num dado (Vetor de Inicialização) que pode ficar cravado no próprio App e na Senha do Usuário, que ele deve digitar toda vez que precisar proteger ou desproteger determinada informação. A Listagem-1 exibe as constantes que usaremos como primeiro fator da senha. São dados contendo 16 caracteres que você poderá substituir por quaisquer outros dados, desde que respeite este tamanho.

Listagem-2 demonstra o método de proteção e a Listagem-3 o de desproteção.

Listagem-1: constantes de inicialização

private static String initializationVector = "1234567812345678";
private static String salt = "1234567812345678";
private static int pswdIterations = 2;
private static int keySize = 256;

Listagem-2: método para proteção
public static String encrypt(String plainText, String password)    throws
NoSuchAlgorithmException,
InvalidKeySpecException,
NoSuchPaddingException,
InvalidParameterSpecException,
IllegalBlockSizeException,
BadPaddingException,
UnsupportedEncodingException,
InvalidKeyException,
InvalidAlgorithmParameterException
{
     byte[] saltBytes = salt.getBytes("UTF-8");
     byte[] ivBytes = initializationVector.getBytes("UTF-8");

     SecretKeyFactory factory =   SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

     PBEKeySpec spec = new PBEKeySpec(
          password.toCharArray(),
          saltBytes,
          pswdIterations,
          keySize
     );

     SecretKey secretKey = factory.generateSecret(spec);
     SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), "AES");

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
     cipher.init(Cipher.ENCRYPT_MODE, secret, new       IvParameterSpec(ivBytes));

     byte[] encryptedTextBytes =  cipher.doFinal(plainText.getBytes("UTF-8"));
     return Base64.encodeToString(encryptedTextBytes, 0);
}

Listagem-3: método para desproteção
public static String decrypt(String encryptedText, String password) throws
 NoSuchAlgorithmException,
 InvalidKeySpecException,
 NoSuchPaddingException,
 InvalidKeyException,
 InvalidAlgorithmParameterException,
 UnsupportedEncodingException
 {
      byte[] saltBytes = salt.getBytes("UTF-8");
      byte[] ivBytes = initializationVector.getBytes("UTF-8");
      byte[] encryptedTextBytes = Base64.decode(encryptedText, 0);

      SecretKeyFactory factory =  SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
      PBEKeySpec spec = new PBEKeySpec(
           password.toCharArray(),
           saltBytes,
           pswdIterations,
           keySize
      );

      SecretKey secretKey = factory.generateSecret(spec);
      SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), "AES");

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
      cipher.init(Cipher.DECRYPT_MODE, secret, new       IvParameterSpec(ivBytes));

      byte[] decryptedTextBytes = null;
      try {
           decryptedTextBytes = cipher.doFinal(encryptedTextBytes);
      } catch (IllegalBlockSizeException e) {
           e.printStackTrace();
      } catch (BadPaddingException e) {
           e.printStackTrace();
      }

      return new String(decryptedTextBytes);
 }

Quer ver mais dicas como esta? Acesse o IAI? em site.iai.art.br