NodeJS 在内存中加载安全密钥安全吗?还是每次都从文件中读取?

b5buobof  于 11个月前  发布在  Node.js
关注(0)|答案(1)|浏览(108)

我有一个node.js服务器,它使用一对非对称密钥进行加密/解密。该服务器大约90%的功能依赖于主动加密和解密数据,或者验证使用这些密钥签名的JWT令牌。
出于安全原因,建议在使用后将任何明文string s或Buffer s(这些密钥已加载到内存中)处理掉。然而,由于密钥的大量使用,每次从文件中阅读它们都会成为一个巨大的性能瓶颈。
出于DRY(* Don 't Repeat Yourself*)的原因,它还让您质疑为什么每个函数每次都必须自己读取密钥文件。

我的问题是:将这些密钥加载到内存中而不是每次从文件中阅读它们有多安全?

你能推荐任何不同的方法吗?请参阅下面的代码:

  • 从文件导出和导入 *
import * as fs from "node:fs";

export const PRIVATE = fs.readSync("./private.key");
export const PUBLIC = fs.readSync("./public.key");

// in another file
import * as KEYS from "./keys";

function doSomething(data) {
  return JWT.sign(data, KEYS.PUBLIC);
}

字符串

VS

  • 就地从文件读取 *
import * as fs from "node:fs";

function doSomething(data) {
  const PUBLIC_KEY = fs.readSync("./public.key");
  return JWT.sign(data, PUBLIC_KEY);
}

kuhbmx9i

kuhbmx9i1#

首先,你想知道它是否安全,而不是它是否安全。安全意味着,阅读数据的行为不会伤害应用程序。它不会。
那么每次从文件中读取数据是否安全呢?广义上讲,安全意味着系统以确保完整性机密性的方式使某些数据可用。因此,一方面是可用性的概念,另一方面是完整性和机密性的概念。
我们已经知道,每次阅读机密都会破坏可用性。它是否能大大提高完整性和机密性,值得这样做?嗯,您可以肯定地说,完整性保持不变-那里没有数据更改。
因此,唯一的问题是关于保密性。我们是否获得了值得的东西?这里有一些威胁建模发挥作用。当你不想在内存中保存秘密时,你害怕什么?有人做内存转储并从你的服务器上的内存中提取秘密?有人在你的服务器上远程执行代码并获得秘密的访问权?
你需要有管理员级别的权限才能做内存转储。如果有人可以在你的应用程序中执行恶意代码,那么仅仅拥有一些临时的秘密不会为你节省太多。
基于这里的逻辑,我会简单地将秘密保存在内存中。如果我洞察到未来出现的新威胁,我也会更新威胁分析。

相关问题