在内存中加载安全密钥是否安全,还是每次都应该从文件中读取?

Is it safe to load security keys in memory or should I read from file every time?

提问人:cristian 提问时间:11/14/2023 更新时间:11/14/2023 访问量:17

问:

我有一台使用一对非对称密钥进行加密/解密的服务器。服务器大约 90% 的功能依赖于主动加密和解密数据,或验证使用这些密钥签名的 JWT 令牌。node.js

出于安全原因,始终建议在使用后处理任何纯文本或在内存中加载此类密钥的 s。但是,鉴于密钥的大量使用,每次从文件中读取密钥成为一个巨大的性能瓶颈。
出于 DRY(不要重复自己)的原因,这也让您质疑为什么每个函数每次都必须自己读取密钥文件。
stringBuffer

我的问题是:将这些密钥加载到内存中而不是每次都从文件中读取它们有多安全?
你能推荐任何不同的方法吗?请参阅下面的代码:

从文件导出和导入

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

就地读取文件

import * as fs from "node:fs";


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

节点.js 安全 加密-非对称

评论


答:

1赞 Marek Puchalski 11/14/2023 #1

首先,你想知道它是否安全,而不是它是否安全。安全意味着读取数据的行为不会损害应用程序。事实并非如此。

那么,每次从文件中读取数据是否安全?从广义上讲,安全意味着系统以确保完整性机密性的方式提供某些数据。因此,一方面是可用性的概念,另一方面是完整性和保密性。

我们已经知道,每次读取机密都会中断可用性。它是否大大提高了完整性和机密性,以至于值得?好吧,您可以肯定地说完整性保持不变 - 那里没有数据更改。

所以唯一的问题是关于保密性。我们是否获得了值得的东西?这里有一些威胁建模的作用。当你不想在记忆中保守秘密时,你害怕什么?有人执行内存转储并从服务器上的内存中提取机密?有人在您的服务器上远程执行代码并访问机密?

您需要已经具有管理员级别的权限才能执行内存转储。如果有人可以在您的应用程序中执行恶意代码,那么仅暂时拥有一些机密不会为您节省太多。

根据这里的逻辑,我只会将秘密保存在内存中。如果我深入了解未来出现的新威胁,我也会更新威胁分析。

评论

0赞 cristian 11/14/2023
是的,人们担心的是内存转储或远程代码执行,它们更容易泄露机密。根据你的分析,我应该更害怕将这些机密存储在纯文本文件中,而不是内存转储或 RCE。感谢您抽出宝贵时间为我分析和解释这一点!