gpt4 book ai didi

java - 如何使 java.io.BufferedOutputStream 为敏感卡数据的内存抓取器提供保护?

转载 作者:搜寻专家 更新时间:2023-10-31 20:09:30 24 4
gpt4 key购买 nike

在 PA-DSS 审核过程中,在运行信用卡支付交易后,我们在服务器端代码(进程内存转储)中发现了信用卡号。

我最初尝试在支付交易结束时调用 JVM 垃圾收集器,因为我们的变量是本地变量来解决这个问题。但是在内存转储中仍然有一个引用信用卡 (CC) 的实例。这个 CC 字符串(实际上它是一个 byte[])被内部使用 sun.net.www.protocol.https.HttpsClient 的 SOAP CXF 客户端对象引用,最终使用 BufferedOutputStream 对象。

查看 BufferedOutputStream 的代码,我注意到私有(private) flushBuffer() 方法只是将计数变量设置为零,而不是重置内部 byte[] 数组。

常规应用程序的代码没有问题(只是重置计数变量更简单有效)但这在我们的安全审计过程中引发了一个标志,所以我的替代方案是创建一个自定义 java.io.BufferedOutputStream 它将重置为零这个字节数组,然后我需要将这个文件添加到 tomcat 引导类路径中。

   private void flushBuffer() throws IOException {
if (count > 0) {
out.write(buf, 0, count);

//NEW - Custom code to reset buffer
for (int i = 0; i < count; i++) {
buf[i] = 0;
}
//End custom code

count = 0;
}
}

这确实有效,我再也找不到内存转储中的 CC 数据,但我认为这不是正确的解决方案(Java 核心类的自定义更改)。

关于如何以不同的方式解决这个问题(无需更改任何库代码)有什么建议吗?

最佳答案

Java 允许您在“不必更改任何库代码”的情况下扩展库。您可以扩展 BufferedOutputStream 以生成 SecureBufferedOutputStream,这将在刷新之后和垃圾收集之前将缓冲区的内容归零(以防您的 JVM 实现尚未将垃圾收集的内存归零)。

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;

public class SecureBufferedOutputStream extends BufferedOutputStream {

public SecureBufferedOutputStream(OutputStream out) {
super(out);
}

public SecureBufferedOutputStream(OutputStream out, int size) {
super(out, size);
}

@Override
public synchronized void flush() throws IOException {
super.flush();
Arrays.fill(buf, (byte) 0);
}

@Override
protected void finalize() throws Throwable {
super.finalize();
Arrays.fill(buf, (byte) 0);
}
}

关于java - 如何使 java.io.BufferedOutputStream 为敏感卡数据的内存抓取器提供保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38444953/

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