代码之家  ›  专栏  ›  技术社区  ›  kspearrin

如何从Electron renderer处理内存转储中清除敏感的Node.js缓冲区?

  •  0
  • kspearrin  · 技术社区  · 7 年前

    我有一个简单的电子测试应用程序,在渲染过程中运行一个角度应用程序。这个角度应用程序有两个页面:登录和帐户使用用户名和密码登录后,将重定向到“帐户”页,然后可以在该页注销。

    登录

    组成部分

    @Component({
        selector: 'app-login',
        templateUrl: 'login.component.html',
    })
    export class LoginComponent {
        password: string;
        username: string;
    
        constructor(private router: Router) {
        }
    
        submit() {
            let usernameBuffer = Buffer.from(this.username, 'utf8');
            let passwordBuffer = Buffer.from(this.password, 'utf8');
    
            // Do some Node stuff with the buffers...
    
            // Now done with the buffers. Clearing the properties like this
            // doesn't seem to help.
            usernameBuffer = null;
            passwordBuffer = null;
    
            this.router.navigate(['/account']);
        }
    }
    

    HTML

    <form id="login-page" (ngSubmit)="submit()">
        <label for="username">Username</label><br>
        <input id="username" type="text" name="Username" [(ngModel)]="username" required><br><br>
        <label for="password">Password</label><br>
        <input id="password" type="password" name="Password" [(ngModel)]="password" required><br><br>
        <button type="submit">Log In</button>
    </form>
    

    帐户

    组成部分

    @Component({
        selector: 'app-account',
        templateUrl: 'account.component.html',
    })
    export class AccountComponent {
    }
    

    HTML

    <p>You are logged in!</p>
    <p><a routerLink="/login">Log Out</a></p>
    

    测试应用程序

    如果感兴趣,可以在此处找到此测试应用程序的完整源代码: https://github.com/kspearrin/electron-memtest 是的。克隆它,然后运行 npm i npm run electron .


    使用windows 10,在用户登录到应用程序并进入帐户页面后,我可以转到任务管理器并执行内存转储以创建一个.dmp文件。在记事本中打开这个.dmp文件,我可以执行搜索并以明文形式查看用户名和密码。

    在这个测试中,我使用用户名“test username”和密码“test password-123”登录。

    .dmp shows password

    只有当我创建 Node Buffers 使用用户名和密码数据,如上面的 LoginComponent . 缓冲区似乎永远不会从内存中释放出来。我想也许节点垃圾收集最终只需要运行,但是,我让这个应用程序整天运行,并且在创建新的.DMP文件时,值仍然存在也许我需要强制运行垃圾回收?

    1. 为什么这些缓冲区会留在内存中?
    2. 如何正确清理这些敏感数据?
    1 回复  |  直到 7 年前
        1
  •  0
  •   Dan D.    7 年前

    fill 他们:

    usernameBuffer.fill(0)
    passwordBuffer.fill(0)