【发布时间】:2017-10-02 16:41:57
【问题描述】:
我创建了一个 RollingFileAppender,它将输出加密为 log4j 日志文件。 目前它使用 AES/ECB/NoPadding,效果很好。
这是我们创建密码的方式
public static Cipher getCipher(boolean encrypt) throws Exception {
//https://en.wikipedia.org/wiki/Stream_cipher
byte[] key = ("sometestkey").getBytes("UTF-8");
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16); // use only first 128 bit
Key k = new SecretKeySpec(key,"AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
if (encrypt) {
cipher.init(Cipher.ENCRYPT_MODE, k);
} else {
cipher.init(Cipher.DECRYPT_MODE, k);
}
return cipher;
}
以下是我们创建附加程序的方法:
public class EncryptingRollingFileAppender extends RollingFileAppender {
private CipherOutputStream s;
private Cipher cipher;
public EncryptingRollingFileAppender() {super();}
public EncryptingRollingFileAppender(Layout layout, String filename, boolean append) throws IOException {super(layout, filename, append);}
public EncryptingRollingFileAppender(Layout layout, String filename) throws IOException {super(layout, filename);}
@Override
protected OutputStreamWriter createWriter(OutputStream outputStream) {
if (cipher==null) {
try {
cipher = DecryptionTools.getCipher(true);
s = new CipherOutputStream(outputStream, cipher);
} catch (Throwable t) {
throw new RuntimeException("failed to initialise encrypting file appender",t);
}
}
OutputStreamWriter out = super.createWriter(s);
return out;
}
}
我们可以使用解密文件
getCipher(假)
创建适当的解密流。
问题是我们的安全团队正在就密钥管理讨价还价。 他们不喜欢使用对称密钥加密,并且希望我们使用密钥对而不是我们必须以某种方式管理的简单密码。
有谁知道使用密钥对的非填充 ECB 加密技术,并且适用于这种流加密和解密?
【问题讨论】:
-
您可以将hybrid encryption 与非对称和对称加密算法的任意组合一起使用,但您还有其他问题。加密的消息需要某种标头。如何区分同一个日志文件中的多条消息?
-
您正在写入配置文件?真的吗?
-
@ArtjomB。你有任何Java混合加密的例子吗?更具体地说,我可以让 RC4 使用异步密钥对吗?
-
@Richard Here 是一个例子,但它没有被流化。我不明白你为什么要使用 RC4。
-
我不太会遵循这个例子。我想使用 RC4,因为它创建的文件与未加密文件的大小相同。换句话说,加密没有额外的有效载荷。这样产生的日志文件将达到每天 60GB。
标签: java encryption cryptography log4j streaming