为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

萧十郎 2021-10-13 16:43:31
我目前正在开发一个从我的网络服务器请求特定属性的 Android 应用程序,如下所示:<properties><property name="Approved-IP" value="SomeIPAddresses"/></properties>该应用程序将站点保存为临时 XML 文件并尝试检查这些 IP。我想让服务器使用 AES 加密属性,如果应用程序没有设置加密密码,请使用默认密钥,如“test123”。然后应用程序通过 EasyCrypt 库解密这些信息并使用它。问题是我真的不知道如何在服务器端执行此操作,因此信息不会以纯文本形式传递。
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

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


我正在使用这种方法来加密我的 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 函数解码返回的字符串并使用此方法对其进行解密:


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

}

结果是正常的属性文件。


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信