有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中,如何清除每个方法中的字节[]数组以保护值不被内存转储?

在爪哇

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

    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);
    }

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

我检查了字节[]是否按值从一个方法复制到另一个方法

是否仍有保护重要字节数组值的方法


共 (1) 个答案

  1. # 1 楼答案

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

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

    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无法在调用digest时维护数组的副本

    如果您甚至不想使用pwd数组,那么只需要从password字段一次获取一个char/byte