【问题标题】:Can I encrypt a zip file with a hashed password and decrypt it with an unhashed one?我可以使用散列密码加密 zip 文件并使用未散列密码对其进行解密吗?
【发布时间】:2018-11-20 00:55:13
【问题描述】:

假设您希望您的用户能够每周一次从您的网站获取包含他们所有数据的软件包。

现在,为了使该软件包更加安全,我们制作了一个受密码保护的 zip 文件。 (或类似的流行格式)。

密码本身是用户在网站上输入的内容(与登录无关),但我们不想以明文形式存储它,因此我们对其进行哈希处理,然后使用哈希处理后的字节来加密最终的包。

现在解压缩时,用户应该只使用他们输入的原始密码。

这是否可能 - 有点像 zip 格式无论如何都会做的第一步散列。

更新:包通过电子邮件分发,但它可以是保管箱或其他 3rd 方服务。即使我的数据中心消失了,数据也应该是可恢复的。其他网站如何提供数据副本?网站关闭时这些是否也可用?我认为许多网站都可以从开放+安全的存档格式中受益。

【问题讨论】:

  • 您希望您的 zip 文件受到什么保护?如果它被篡改(你希望你的包是真实的),普通加密没有帮助。您需要 MAC、签名或经过身份验证的加密,它们都是不同的方案,具有各自的风险概况和实施细节。
  • 该 zip 文件包含用户的个人数据(想想 GDPR 或类似数据),现在它作为明文进入电子邮件并不理想。
  • 这是一个很好的观点。我只需要教育用户不要使用秘密密码,也不要在其他任何地方使用它。

标签: security encryption archive


【解决方案1】:

加密哈希函数是抗冲突的单向函数,无法根据其哈希值计算输入值。

h(x) = y; h(y) = z

要解密 zip 文件,用户必须不可避免地输入与您所做的完全相同的值 - 它自己的密钥的哈希值(使用与您使用的相同的哈希函数和添加的相同的盐计算,如果您添加了一些)。

因此,您可以实现您的场景的唯一方法是告知用户您的哈希函数,例如通过编写您自己的小“解压缩应用程序”,您将其提供给用户以供下载。这个小应用程序将未散列的密码作为输入,以与您在服务器上使用它们的方式完全相同的方式对它们进行散列,然后使用散列值打开 zip 文件。

【讨论】:

  • 是的,我希望其中一种可用的存档格式已经做到了这一点。我知道这是一个漫长的过程 - 但你永远不知道,可能是 zip 总是这样做的:HASH->ENCRYPT + HASH->DECRYPT 然后我可以在创建中拦截以避免构建散列。解压缩应用程序是一个想法,但它必须更像是一个脚本,以便人们可以查看内部并看到它没有做坏事。
  • 这也是我心中的想法。希望以后能实现
【解决方案2】:

您正在寻找的是非对称加密,其中消息或文件使用公钥加密并使用私钥解密。据我所知,zip文件格式只支持对称加密(加解密密码相同)。

散列密码不能用于加密。它与公钥有很大不同。所以很遗憾,您提出的方法不起作用。

但是,您是否考虑过加密下载通道而不是文件?为什么不使用密码登录网页的安全部分——受 HTTPS 保护——用户可以在其中下载未加密的 zip 存档?在这种情况下,您可以将安全部分的登录密码保存为散列形式。

另一种选择是将敏感密码存储在硬件安全模块 (HSM) 中,并让 HSM 加密数据。 HSM 可以以无法检索密码的方式使用。这就是他们加密数据的原因。这样,密码是安全的。

【讨论】:

  • 我希望用户能够在我的网站不再存在的那一天恢复数据。这就是为什么我每周都会向他们发送一封包含数据的电子邮件。今天那是不理想的明文。
【解决方案3】:

根据您的要求,您可能需要查看“年龄”。 可以使用 ssh-keygen 生成公钥和私钥。 我用下面的 debian 命令摘录了我的摘录。使用公钥对 zip 文件进行加密后,除了对应的私钥之外,无法对其进行解密。因此,即使中间的拦截器拥有加密文件和加密它的公钥,他也无法解密它。 参考https://github.com/FiloSottile/age

# on both sides
sudo apt install age
# on the sender side
age -e -R receiver_public_key_file.pub -o file.zip.age file.zip
# on the receiver side
age -d -i receiver_private_key -o file.zip file.zip.age

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 2013-01-08
    • 1970-01-01
    • 2011-06-23
    • 2018-01-20
    • 2021-06-04
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多