gpt4 book ai didi

java - 在java中,如何清除每个方法中的byte[]数组以保护值免受内存转储?

转载 作者:行者123 更新时间:2023-11-30 02:18:04 29 4
gpt4 key购买 nike

在java中,

如果我运行下面的代码,pwd 值存在于整个内存中,因为字节数组值被复制到摘要方法,该方法还会将该值复制到其他一些方法。

    import java.security.MessageDigest

byte[] pwd = "some_pwd".getBytes();
MessageDigest md = MessageDigest.getInstance("SHA");
for (int i = 0; i < 100; i++) {
byte[] hash = md.digest(pwd);
}

内存转储软件显示我的客户不喜欢的密码值。

我检查了 byte[] 是按值从一个方法复制到另一个方法的。

是否有办法保护重要的字节数组值?

最佳答案

密码文本最好不要作为字符串传递,但我们假设这是一个示例:

然后确保这些字节不会出现在测试的字符串中。

byte[] pwd = "rnld^ovc".getBytes(StandardCharsets.UTF_8); // "some_pwd"
for (int i = 0; i < pwd.length; ++i) {
pwd[i]++;
}

然后是解决方案:

MessageDigest md = MessageDigest.getInstance("SHA");
for (int i = 0; i < 100; i++) {
//byte[] hash = md.digest(pwd);
for (byte b : pwd) {
md.update(b - 1); // Maybe -1 if the string was the real password
}
byte[] hash = md.digest();
}
Arrays.fill(pwd, (byte)0);

现在 MessageDigest 无法在调用摘要时维护数组的副本。

如果您甚至不想拥有 pwd 数组,则只需从密码字段中一次获取一个字符/字节。

关于java - 在java中,如何清除每个方法中的byte[]数组以保护值免受内存转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47691112/

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