Шифрование файла свойств веб-сервера (AES) - PullRequest
0 голосов
/ 27 сентября 2018

В настоящее время я разрабатываю приложение для Android, которое запрашивает определенные свойства у моего веб-сервера, которые выглядят следующим образом:

<properties>
<property name="Approved-IP" value="SomeIPAddresses"/>
</properties>

Приложение сохраняет сайт как временный файл XML и пытается проверить эти IP-адреса.Я хочу позволить серверу зашифровать свойства с помощью AES, и если в приложении не установлен пароль шифрования, используйте ключ по умолчанию, например «test123».

Затем приложение расшифровывает эту информацию с помощью библиотеки EasyCrypt и используетЭто.

Проблема в том, что я не знаю, как это сделать на стороне сервера, чтобы информация не передавалась в виде простого текста.

1 Ответ

0 голосов
/ 28 сентября 2018

Итак, я нашел решение для своей программы (будьте осторожны, это только для упражнений, поэтому я бы не назвал его безопасным ЛЮБОЙ)

Я использую этот метод для шифрования String на моем WebServer:

private static byte[] encrypt(String plain, String key) throws Exception {
    byte[] clean = plain.getBytes();

    int ivSize = 16;
    byte[] iv = new byte[ivSize];
    SecureRandom random = new SecureRandom();
    random.nextBytes(iv);
    IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.update(key.getBytes("UTF-8"));
    byte[] keyBytes = new byte[16];
    System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
    SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
    byte[] encrypted = cipher.doFinal(clean);

    byte[] encryptedIVAndText = new byte[ivSize + encrypted.length];
    System.arraycopy(iv, 0, encryptedIVAndText, 0, ivSize);
    System.arraycopy(encrypted, 0, encryptedIVAndText, ivSize, encrypted.length);

    return encryptedIVAndText;
}

Затем я кодирую сгенерированную строку с помощью Base64

Base64.getEncoder (). EncodeToString (encryptedString)

и возвращаюBase64 String.

Мое приложение декодирует возвращенную строку, используя функцию getDecoder, и расшифровывает ее следующим способом:

public static String decrypt(byte[] encryptedIvTextBytes, String key) throws Exception {
    int ivSize = 16;
    int keySize = 16;

    byte[] iv = new byte[ivSize];
    System.arraycopy(encryptedIvTextBytes, 0, iv, 0, iv.length);
    IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

    int encryptedSize = encryptedIvTextBytes.length - ivSize;
    byte[] encryptedBytes = new byte[encryptedSize];
    System.arraycopy(encryptedIvTextBytes, ivSize, encryptedBytes, 0, encryptedSize);

    byte[] keyBytes = new byte[keySize];
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(key.getBytes());
    System.arraycopy(md.digest(), 0, keyBytes, 0, keyBytes.length);
    SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");

    Cipher cipherDecrypt = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipherDecrypt.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
    byte[] decrypted = cipherDecrypt.doFinal(encryptedBytes);

    return new String(decrypted);
}

И в результате получается файл нормальных свойств.

...