gpt4 book ai didi

java - 如何正确使用CipherOutputStream对log4j(RollingFileAppender)创建的日志进行加解密

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:43 27 4
gpt4 key购买 nike

我在加密/解密由 log4j 的 RollingFileAppender 生成的日志文件时遇到问题。对于加密,我尝试扩展 RollingFileAppender,将其称为 EncryptedRollingFileAppender。我覆盖了方法

setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)

基本上我使用 CipherOutputStream 和 Base64OutputStream 来加密和编码写入输出流的所有内容。这是部分代码:

...
setImmediateFlush(true);

FileOutputStream ostream = null;
CipherOutputStream cstream = null;
Base64OutputStream b64stream = null;
try {
byte[] keyBytes = "1234123412341234".getBytes(); //example
final byte[] ivBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; //example

final SecretKey key = new SecretKeySpec(keyBytes, "AES");
final IvParameterSpec IV = new IvParameterSpec(ivBytes);
final Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, IV);

ostream = new FileOutputStream(fileName, true);
b64stream = new Base64OutputStream(ostream);
cstream = new CipherOutputStream(b64stream, cipher);

} catch(Exception ex) {
ex.printStackTrace();
}

Writer cw = createWriter(cstream);
...

然后我用这段代码解密文件:

private static void decryptFile(String filename) throws Exception {
FileInputStream fis = null;
BufferedReader br = new BufferedReader(new FileReader(filename));

File file = new File(filename + "-decrypted");
file.createNewFile();
Writer out = new OutputStreamWriter(new FileOutputStream(filename + "-decrypted"), "UTF-8");

String line = null;
try {
while (( line = br.readLine()) != null){
line = decrypt(Base64.decodeBase64(line));
out.write(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
br.close();
}
if (fis != null) {
fis.close();
}
if (out != null) {
out.close();
}
}
}

public static String decrypt(byte[] line) throws Exception {
byte[] keyBytes = "1234123412341234".getBytes();
final byte[] ivBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };

final SecretKey secretkey = new SecretKeySpec(keyBytes, "AES");
final IvParameterSpec IV = new IvParameterSpec(ivBytes);
final Cipher decipher = Cipher.getInstance("AES/CFB8/NoPadding");
decipher.init(Cipher.DECRYPT_MODE, secretkey, IV);
final byte[] plainText = decipher.doFinal(line);

return new String(plainText, "UTF-8").trim();
}

它起作用了,但只是部分起作用。结果文件中的一些文本被正确解密,但另一些则没有。如果你很好奇,这就是我所说的部分的意思:

07 Jul 11 13:13:13, DEBUG  MrBean.java:checkUserVal���̥V;��ƃ�˨�� - username: squall,password: 4GROmr95Qcf����v�M�7�y�5�@CGO09 ,active: true 

我也曾尝试将算法更改为“DESede”,但仍然部分解密。然后我尝试在两端使用“CBC/PKCS5Padding”,但出现异常

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

我假设加密没有正确填充输入,但我想知道为什么...因为当我使用相同的加密和解密算法而不使用 CipherOutputStream 时,填充工作得很好。任何人都可以帮助我完成这项工作吗?任何帮助将不胜感激。

PS:对不起我的英语,它不是我的母语。

最佳答案

看起来不错。您是否正在为每条消息重置/初始化密码对象?您可能不想这样做,但如果您这样做,则需要仔细考虑密码文件的结构,因为解密器需要知道消息边界在哪里。

关于java - 如何正确使用CipherOutputStream对log4j(RollingFileAppender)创建的日志进行加解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6608529/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com