CryptoJS.AES 是否通过使用随机的 256 位字符串(一次使用)来确定?

问题描述 投票:0回答:1

我想在我的服务器上安全、永久地存储一个秘密。在存储它之前,我会运行以下代码:

import CryptoJS from 'crypto-js';

const SECRET = 'secret';
const key = CryptoJS.SHA256(rollHeadOnKeyboard());
const encrypted = CryptoJS.AES.encrypt(SECRET, key);

const key2 = CryptoJS.SHA256(rollHeadOnKeyboard());
const doubleEncrypted = CryptoJS.AES.encrypt(encrypted, key2);

function rollHeadOnKeyboard() {
//random keyboard mashing into 256 bit string
}

我加密了两次,所以我可以在每个服务器上保留一个密钥,这意味着必须破坏两个服务器才能解密这个秘密。我的问题是这是否是铁定的,即我可以将 doubleEncrypted 上传到 github 并期望它是安全的吗?

当我这样做时,我自己选择一个随机字符串是否是一个可怕的安全漏洞(即比 PBKDF2 的密码短语更糟糕?)是否有一些明显的原因我不能使用这种方法来加密我的服务器之间的消息(与仅使用TLS)?

node.js encryption aes cryptojs encryption-symmetric
1个回答
0
投票

我加密了两次,所以我可以在每个服务器上保留一个密钥,这意味着必须破坏两台服务器才能解密这个秘密。

一般来说,您会研究 秘密共享 方案,而不是对数据进行两次加密。加密数据两次当然可以,但在那种情况下,您也可以加密一个完全随机的“数据密钥”两次,然后使用它加密一个。

我的问题是这是否是铁定的,即我可以将 doubleEncrypted 上传到 github 并期望它是安全的吗?

系统可能安全也可能不安全,算法、方案和协议只是实现目标的一种方式。您将如何确定您的服务器正在为另一台服务器加密?如果一台服务器遭到破坏,究竟会发生什么?

当我这样做的时候,我自己选择一个随机字符串是一个可怕的安全漏洞吗(即比 PBKDF2 的密码更糟糕?)

人类在生成真正随机的数据方面很糟糕。他们更难记住它。在这种情况下,我不明白这一点。让密码管理器生成并存储数据,以防您需要密码。

有什么明显的原因我不能使用这种方法来加密我的服务器之间的消息(与仅使用 TLS 相比)?

传输协议确实存在很多问题。例如,您可以对客户端和服务器都使用证书身份验证。

此外,CryptoJS 只允许 CBC 加密,不对消息进行身份验证。您很可能会创建明文或填充 oracle,从而允许攻击者解密信息。在消息身份验证中,您必须担心攻击者会更改消息。

© www.soinside.com 2019 - 2024. All rights reserved.