C++ 使用计数器模式使用SHA256加密数据是否明智?

C++ 使用计数器模式使用SHA256加密数据是否明智?,c++,c,qt,encryption,sha256,C++,C,Qt,Encryption,Sha256,我必须为项目加密用户的vpn密码。它们只存储在本地机器上,但我想避免硬盘上的纯文本密码。 我重新盐和散列用户主密码加密vpn密码使用XTEA在计数器模式。。。 然后我认为也可以在某种计数器模式下使用sha256加密vpn密码 伪c代码: string masterpasswd, txtdata; uint32_t data[] = unicode(txtdata); uint32_t key[8] = sha256(masterpasswd+salt); for(

我必须为项目加密用户的vpn密码。它们只存储在本地机器上,但我想避免硬盘上的纯文本密码。 我重新盐和散列用户主密码加密vpn密码使用XTEA在计数器模式。。。 然后我认为也可以在某种计数器模式下使用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);
    }
字符串masterpasswd,txtdata;
uint32_t data[]=unicode(txtdata);
uint32_t键[8]=sha256(主密码+salt);

对于(int i=0;iNo)-当您的数据大于密钥时,对于密码为“正确”的用户,会发生什么情况

或者

  • 您的代码会中断,因为它试图查找8字节键的第9个字节

  • 您的实际实现(而不是伪代码)最终再次环绕到密钥的字节0,即ECB模式,这是您永远不应该使用的一种模式(请参阅),因为“passwordpassword”将导致相同的加密输出两次,这是一个巨大的提示

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

您甚至可以更懒惰,使用现有的Qt:)类。

懒惰的人通常都是优秀的程序员。祝你好运SHA是一种哈希算法,不是一种加密方法。@Captain Obvlious:我知道,但我想把它变形为一种加密方法。我问是因为我不确定这个密码的安全性。你不能这么做。如果需要加密,请使用加密。如果您需要哈希,请使用哈希。专业完成的生产级加密经常会出现问题(OpenSSL版本升级到1.0.0l和1.0.1f是有原因的)。家庭烘焙的加密是普遍的,总是从根本上被破坏。这比你想象的要困难得多。魔鬼在细节中。这些细节让银行破产。你在执行任务,我同意你的任务。这是一个很好的任务,就任务而言,它是永无止境的。祝你好运:)使用自制的“加密”总是个坏主意。由于将Qt与openssl链接很简单,即使您想要一个静态链接的windows可执行文件,我真的看不出有任何理由使用自制的解决方案。基本上,如果它是用于加密的,而不是一个已经被知道他们在做什么的人查看过的流行库,那么最安全的假设是它已经损坏了。@KubaOber如果你读过这篇文章:“强加密显然是最好的解决方案[…],在这种情况下,它可能会被过度使用。”