使用计数器模式使用SHA256加密数据是否智能?

时间:2014-02-25 01:44:16

标签: c++ c qt encryption sha256

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

伪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,因为我很懒;) 这是一个聪明的解决方案吗?

2 个答案:

答案 0 :(得分:3)

不 - 如果您的数据大于您的密钥,对于密码为“正确马匹电池主食”的用户会发生什么?

要么

  • 你的代码中断了,因为它试图找到8字节密钥的第9个字节

  • 你的实际实现(而不是你的伪代码)最终会再次回到键的字节0,即ECB模式,这是你永远不应该使用的一种模式(见Adobe),因为然后,“passwordpassword”将导致相同的加密输出两次,这是一个巨大的提示。

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

答案 1 :(得分:-1)

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