提问人:cristian 提问时间:11/14/2023 更新时间:11/14/2023 访问量:17
在内存中加载安全密钥是否安全,还是每次都应该从文件中读取?
Is it safe to load security keys in memory or should I read from file every time?
问:
我有一台使用一对非对称密钥进行加密/解密的服务器。服务器大约 90% 的功能依赖于主动加密和解密数据,或验证使用这些密钥签名的 JWT 令牌。node.js
出于安全原因,始终建议在使用后处理任何纯文本或在内存中加载此类密钥的 s。但是,鉴于密钥的大量使用,每次从文件中读取密钥成为一个巨大的性能瓶颈。
出于 DRY(不要重复自己)的原因,这也让您质疑为什么每个函数每次都必须自己读取密钥文件。string
Buffer
我的问题是:将这些密钥加载到内存中而不是每次都从文件中读取它们有多安全?
你能推荐任何不同的方法吗?请参阅下面的代码:
从文件导出和导入
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);
}
答:
首先,你想知道它是否安全,而不是它是否安全。安全意味着读取数据的行为不会损害应用程序。事实并非如此。
那么,每次从文件中读取数据是否安全?从广义上讲,安全意味着系统以确保完整性和机密性的方式提供某些数据。因此,一方面是可用性的概念,另一方面是完整性和保密性。
我们已经知道,每次读取机密都会中断可用性。它是否大大提高了完整性和机密性,以至于值得?好吧,您可以肯定地说完整性保持不变 - 那里没有数据更改。
所以唯一的问题是关于保密性。我们是否获得了值得的东西?这里有一些威胁建模的作用。当你不想在记忆中保守秘密时,你害怕什么?有人执行内存转储并从服务器上的内存中提取机密?有人在您的服务器上远程执行代码并访问机密?
您需要已经具有管理员级别的权限才能执行内存转储。如果有人可以在您的应用程序中执行恶意代码,那么仅暂时拥有一些机密不会为您节省太多。
根据这里的逻辑,我只会将秘密保存在内存中。如果我深入了解未来出现的新威胁,我也会更新威胁分析。
评论