【问题标题】:Check password before decryption解密前检查密码
【发布时间】:2011-03-20 01:29:10
【问题描述】:

我正在编写小程序 (C++) 来加密/解密文件。在解密之前,我想检查用户提供的密码是否正确。我的想法:

  • 在文件开头添加一些字符串(例如:“GOOD”);
  • 加密文件
  • 解密时首先解密文件的开头并检查“GOOD”字符串

这是正确的吗?

【问题讨论】:

    标签: c++ passwords encryption


    【解决方案1】:

    关于加密的主要建议:不要自己实施。那里有很多excellent libraries

    您的建议提供了一个backdoor (crib) 来破解您的加密。即使experts 在设计加密时也会出错(更不用说密钥管理了!)。

    (当然,我不是建议布鲁斯ever get things wrong!)

    【讨论】:

    • zlib 是一个压缩库。
    • @Gumbo:没错。我马虎。更改为 SO 问题链接。
    【解决方案2】:

    我建议使用某种校验和,而不是“好”字符串,例如 MD5、CRC、SHA256 等。此校验和将从文件的前几个字节(例如 128)计算。

    无论如何,使用现有的加密库是一个更好的主意。

    【讨论】:

    • zlib 是一个压缩库。
    • 我只是补充一下——在开始时对固定字符串进行加密的问题在于,利用它来破解代码相对容易。例如,由于熵的原因,压缩数据(例如使用 zlib)是很常见的,这使得它更难破解。但是您不使用标准 zip 工具进行该压缩,因为标头即使不是完全固定的字符串,仍然可以用于破解代码。必须使用无头压缩。拥有初始字符串的哈希仍然是一个线索,但是您哈希的字符串越长,就越难利用。
    【解决方案3】:

    您可以考虑在开头存储文件的一些哈希函数,例如MD5。

    【讨论】:

      【解决方案4】:

      拥有一个已知的加密值将有助于破解者找出您的加密密钥。

      【讨论】:

      • 是的,所以可能放在文件 md5(password+salt) 的开头?
      【解决方案5】:

      更好的是:使用哈希(例如 SHA256)对文件本身进行加密(例如使用 AES256),并将明文文件的哈希(可以是任何东西,甚至是简单的 CRC)附加到加密文件。

      破译:

      • 向用户询问密码
      • 使用 SHA256 对密码进行哈希处理
      • 使用密码哈希作为密钥解密文件
      • 计算解密文件的 CRC
      • 如果计算出的 CRC 与密文后附加的内容匹配,则密码正确。如果它们不匹配,则密钥不好,您破译了垃圾,这意味着密码不好。

      作为奖励,无需在某处保留“秘密”密钥,它都是独立的。此外,暴力破解/字典攻击很痛苦,因为每次尝试检查 CRC 时,您都必须破译整个文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多