当前位置: 首页 > 面试题库 >

如何正确使用CipherOutputStream加密和解密使用log4j(RollingFileAppender)创建的日志

南门宇
2023-03-14
问题内容

我在加密/解密由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:对不起,我的英语不是我的母语。


问题答案:

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



 类似资料:
  • 问题内容: 编辑:::问题中的代码有效,但是一旦在相机中拍摄了图像,返回活动大约需要10秒钟。我放弃了这种方法,而是使用Facebook的隐秘库对图像进行加密和解密。 我看了很多示例,但是仍然找不到解决正确加密和解​​密的方法。我以为我在互联网上使用一些随机代码时是正确的,但是在解码时会收到BadPadding异常。 所以,我正在努力解决。正如大多数人在SO上所建议的那样,我正在关注以下问题(但是

  • 编辑:::问题中的代码起作用,但一旦图像被相机拍摄,返回活动需要大约10秒的时间。我放弃了这种做法,使用Facebook的隐藏库来加密和解密图像。链接到Facebook的解决方案:Facebook隐藏-图像加密和解密 所以,我正在努力解决这个问题。我遵循下面的问题,正如SO上的大多数人所建议的那样(但这段代码展示了如何加密字符串)。有人能帮我加密和解密图像吗?问题中的代码是否适用于图像? 链接到问

  • 问题内容: 有没有一种方法可以解密Java中的密码。Java将算法实现为。我得到了创建密码哈希的代码。我在下面提到了哈希技术的链接: http://howtodoinjava.com/security/how-to-generate-secure-password-hash- md5-sha-pbkdf2-bcrypt-examples/ 我的要求是以加密格式存储第三方FTP服务器密码,并在需要登

  • 我使用的是Web加密,更具体地说,这些示例是:https://github.com/diafygi/webcrypto-examples/#rsa-oaep 更新

  • 这是可能的还是加密必须共享和使用相同的密钥? 主要目的就是这样。 我将有两个客户端可以发送和接收加密数据到彼此。

  • 问题内容: 我正在制作一个需要基于Java的AES加密和基于JavaScript的解密的应用程序。我正在使用以下代码作为基本形式进行加密。 我试图用来解密的JavaScript是 但是JavaScript解密无法正常工作。我是新手,有人可以告诉我一种无需更改Java代码块即可解决的方法吗? 我尝试使用Base-64解码文本,如下所示: 但还是不好 我尝试了以下建议的解决方案来解决可能的填充问题,但