加密Web服务器(AES)的属性文件

时间:2018-09-27 07:59:35

标签: java encryption aes

我目前正在开发一个Android应用,该应用可以从我的Web服务器请求特定的属性,如下所示:

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

该应用程序将网站另存为临时XML文件,并尝试检查这些IP。 我想让服务器使用AES加密属性,如果应用未设置加密密码,则使用默认密钥,例如“ test123”。

然后,应用程序通过EasyCrypt库解密此信息并使用它。

问题是我真的不知道如何在服务器端进行操作,因此信息不会以纯文本格式传递。

1 个答案:

答案 0 :(得分:0)

所以我找到了程序的解决方案(请注意,这只是为了锻炼,所以我不会以任何方式称其为安全)

我正在使用此方法来加密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字符串。

我的应用使用getDecoder函数对返回的String进行解码,并使用以下方法对其进行解密:

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);
}

结果是普通的属性文件。