使用计数器模式使用 SHA256 加密数据是不是明智?

Posted

技术标签:

【中文标题】使用计数器模式使用 SHA256 加密数据是不是明智?【英文标题】:Is it smart to encrypt data with SHA256 using counter mode?使用计数器模式使用 SHA256 加密数据是否明智? 【发布时间】:2014-02-25 01:44:15 【问题描述】:

我必须为项目加密用户 *** 密码。它们只存储在本地机器上,但我想避免硬盘驱动器上的纯文本密码。 我重新加盐并散列用户主密码以在计数器模式下使用 XTEA 加密 *** 密码...... 然后我认为也可以在某种计数器模式下使用 sha256 加密 *** 密码。

伪c代码:

    string masterpasswd, txtdata;
    uint32_t data[] = unicode(txtdata);
    uint32_t key[8] = sha256(masterpasswd+salt);
    for(int i=0;i<data_size;i++) 
      encrypted[i] = data[i] ^ key[i];
      key=sha256(key+i);
    

我不想使用 openssl,因为我很懒 ;) 这是一个聪明的解决方案吗?

【问题讨论】:

懒惰的人通常是优秀的程序员。祝你好运! ;) SHA 是一种哈希算法,不是一种加密方法。 @Captain Obvlious:我知道,但我想把它变成一种加密方法。我问是因为我不确定这段代码的安全性。 你不能那样做。如果您需要加密,请使用加密。如果您需要哈希,请使用哈希。 专业的生产级加密经常出现问题(OpenSSL 版本升级到 1.0.0l 和 1.0.1f 是有原因的)。自制加密普遍地,总是从根本上被破坏。这比你想象的要难得多。魔鬼在细节中。这些细节让银行破产。 【参考方案1】:

否 - 当您的数据大于您的密钥时,对于密码为“正确的马电池钉”的用户会发生什么?

要么

您的代码中断,因为它试图获取 8 字节密钥的第 9 个字节

您的实际实现(而不是您的伪代码)最终会再次环绕到密钥的字节 0,即 ECB 模式,这是您永远不应该使用的一种模式(请参阅 Adobe),因为“密码密码" 然后会产生两次相同的加密输出,这是一个很大的提示。

更严重的是,不要这样做。您应该使用 PBKDF2(对于 OpenSSL,即 PKCS5_PBKDF2_HMAC() 和 EVP_sha512() 作为散列函数 - 您需要 evp.h 和 sha.h)从您的主密码和 salt 派生所需大小的加密密钥,并且然后使用 OpenSSL 来实际使用 ecb 模式以外的方式进行加密。

【讨论】:

你正在执行一项任务,我赞成你的任务。这是一个很好的任务,就任务而言,它是永无止境的。祝你好运:)【参考方案2】:

您可以更加懒惰并使用现有的 Qt 类 Simple Crypt :)

【讨论】:

使用自制的“加密”总是一个坏主意。由于将 Qt 与 openssl 链接起来是微不足道的,即使您想要一个静态链接的 windows 可执行文件,我真的认为根本没有理由使用自制解决方案。基本上,如果它是用于加密而不是那些知道自己在做什么的人看过的流行库,那么最安全的做法是假设它已损坏。 @KubaOber 如果你读过这篇文章:“强密码学显然是最好的解决方案 [...] 对于这种情况可能只是矫枉过正。”

以上是关于使用计数器模式使用 SHA256 加密数据是不是明智?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Crypto++ 中使用 RSA OAEP SHA-256 加密/解密数据

sha256随机盐+密钥啥意思?

PHP SHA256怎么带密钥加解密

使用SHA-256和RSA 2048进行加密和签名

解码哈希sha256加密,知盐

sha256双向加密吗