从node.js应用程序中将字符串安全地存储在内存中

时间:2013-06-12 18:31:51

标签: node.js security memory

In this question,Mubashar询问是否使用C#将敏感信息安全地存储在内存中,并指向.NET中的SecureString类。是否存在可在node.js中执行此操作的现有类似工具?否则,这是使用可用节点资源实现此目的的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用闭包来限定私钥和salt 并且在该闭包内部有另一个用散列密码创建的闭包 让内部闭包返回一个接受挑战的函数(比如你的密码来解锁它)

function outer (key, salt) {
  return function generator (password) {
    var hash = gen_hash(key, salt, password);
    password = undefined;
    return function (challenge) {
      var response = test_challenge(challenge, hash, key, salt);
      return repsonse;
    }
  }
}

使用它:

var challenger = outer('my-key','salt')('password')

然后,当您想要检索加密密码时,您必须通过挑战

var password = challenger('my-unlock-code');

使用您喜欢的任何密码学库 这不是一个有效的例子,它只是一个关于如何使用闭包来确定敏感数据范围的例子。

答案 1 :(得分:0)

唯一的方法是使用类似Uint8Array的类型化数组(Buffer类只是一个薄包装器),并在使用后用null或任何其他值填充它。

但是要考虑一些事情:

例如,当您获得凭据时,您很有可能将其作为JSON获取。在这种情况下,如果不进行拦截,那么任何努力都是徒劳的,这样请求主体就不会像任何Web框架那样存储在字符串中。

当您从文本文件中读取API密钥时,很明显为什么内存安全可能不是最大的问题。为此,应该考虑一个密钥库。

但是即使那样,您仍然不能真正确定没有泄漏。例如,我怀疑node.js streams会自己清理。即使您手动覆盖它们,也可能因复制或系统API泄漏。甚至密码管理器也存在泄漏密码的问题。

总结:即使您考虑了所有因素,也很可能会发生无法避免的泄漏。