gpt4 book ai didi

javascript - 验证解密字符串

转载 作者:行者123 更新时间:2023-12-04 08:19:31 26 4
gpt4 key购买 nike

我正在使用 Node.js 加密库来使用 AES-256-ctr 加密较大的文件。我现在遇到的一个问题是验证解密是否成功。目前,如果我使用错误的密码,我无法知道解密失败,直到我查看文本并意识到它不可读,但这使得以编程方式检查和要求密码重试变得困难。
到目前为止,我从研究中收集到的信息(如果我错了,请纠正我):

  • 我可以使用 HMAC 来验证解密消息的完整性
  • 我应该总是在加密后运行 HMAC 函数,因为在加密数据之前对任何内容进行散列而不是对散列本身进行加密会违背加密的目的
  • 不要使用相同的 key 进行加密和 MAC

  • 我的问题:
    会不会是错误的,如果是的话,为什么,只是在我想加密的消息中添加/附加一个字符串,然后在我解密时检查它是否在那里。这似乎是一个简单的检查,但我无法理解为什么不应该这样做。
    前任。
    加密:
  • ' Hello World '
  • (在字符串前面加上)'ENCRYPTED:hello world'
  • (加密消息)
  • 'iv:abc123'

  • 解密:
  • 'iv:abc123' ->(解密)
  • decStr = 'ENCRYPTED:hello world' 或 'ab/12c879312sc/!/'
  • if (decStr.split(':')[0] === 'ENCRYPTED') { 正确解密}

  • 我应该为 createHmac() 函数中的“ secret ”使用什么?我不想要求用户持有两个密码。一种用于加密,一种用于验证。我可以使用通过 scrypt 加密密码得到的派生 key 吗?
    我不知道这是一个愚蠢的问题还是我只是没有搜索正确的东西,但是与此类似的一些问题只是说使用 aes-gcm 来避免不必担心这个问题。我主要只是好奇如何做到这一点。

    最佳答案

    您可能不想只是在消息前添加一个字符串。这是因为攻击者可以篡改初始字符串之外的消息,而您仍然无法检测到它。因为 CTR 模式使用 XOR 与 key 流进行加密,所以这是微不足道的。
    您想要执行以下两种操作之一:使用 AEAD 进行加密,例如 AES-GCM 或 ChaCha20-Poly1305,或者对加密数据使用带有 HMAC 的 CTR 模式。请注意,如果您这样做,则绝不能重复使用加密的 key 随机数对,否则您将失去所有安全性。
    最简单、最简单的方法是使用 AES-GCM。您可以以适当的方式生成单个加密安全 key 。然后,从系统 CSPRNG 生成一个随机的 256 位盐。然后这样做( || 是串联):

    PRK = HMAC-SHA-256(salt, initial-key)
    key = HMAC-SHA-256(PRK, "encryption key" || 0x01)
    IV = HMAC-SHA-256(PRK, "nonce" || 0x01)
    这使用 HKDF要生成加密 key ,即 IV(您需要将其 chop 为 12 个字节)。加密数据,并发出 32 字节的盐和加密的消息。
    这样,只要您始终为每个加密选择一个随机盐,无论您是否使用相同的初始 key 都没有关系,因为您实际上永远不会重复使用 key -IV 对。
    如果这些文件太大,以至于您迫不及待地等待检查整个加密以查看它们是否正确,则添加一个额外的 32 字节值:
    check-value = HMAC-SHA-256(PRK, "check value" || 0x01)
    然后,发出用 AES-GCM 加密的盐、校验值和数据。要验证密码,请检查校验值是否相同,如果不相同,则为错误。如果更适合您的环境(ARM 系统或其他没有 AES 加速的系统),所有这些方法也可以使用 ChaCha20-Poly1305 完成。
    额外的 0x01 字节绝对不是必需的,但使用它意味着您使用的是 HKDF,这意味着您可以说您使用的是备受推崇的标准方法。

    关于javascript - 验证解密字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65556689/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com