加密用于存储的密码

时间:2014-03-16 12:07:22

标签: c++ encryption

我正在用C ++编写一个小工具,我对如何将加密密码存储在文本文件中感到困惑。 我搜索过互联网。关于哈希的流行建议是:

  

“基本概念是您获取密码,使用它来计算其哈希值,然后存储该哈希值。稍后,当用户输入密码进行登录时,您再次计算其哈希值并将生成的哈希值与存储的哈希。“

但是,我需要将密码解密为纯文本。我该怎么办? 请给我任何建议。

2 个答案:

答案 0 :(得分:2)

在您描述的方案中,散列密码不适用。由于您确实需要SMTP服务器的明文密码,因此您别无选择,只能以加密方式存储它。

尽管如此,我真的希望您使用SSL连接到您的SMTP服务器,否则您根本不必担心加密,因为密码将在网络上被盗(比在本地计算机上更可能)。

加密密码以便可以恢复的问题是,如果您的程序能够在没有用户干预的情况下执行此操作,则解密密钥必须存储在可执行文件(或数据文件)中,因此每个人原则上可以恢复原始密码 在随意检查中(例如使用十六进制编辑器时)很难使密码不可读,但是以某种方式执行此操作非常困难(没有用户交互:不可能),因此无法恢复。

如果适用的话,你应该没有将加密密钥存储在程序或任何这样的东西中,而是在启动时提示用户一次该密钥,然后程序将被缓存在内存中用于剩余的它的运行时间。请确保锁定(在Windows下的mlock,在Windows下的LockVirtualMemory)将存储解密密码的页面,因此无法将其写入交换。

除此之外,它非常简单,您可以使用任何类型的现成算法。由于加密算法肯定不会是您安全链中最薄弱的环节,因此您选择哪一个并不重要。当然,您仍然不应该刻意选择像简单的xor-encryption那样的简单破解算法,但任何有点严重的算法(如TEA,Blowfish或Twofish,或AES)都可以做得很好。 /> 我可能只选择TEA,因为它只有六行代码,并且与#34;存储加密的明文密码相同。无论如何都可以得到。

答案 1 :(得分:0)

基本原则,如评论中所述:

添加新用户时,会对密码进行哈希处理,并存储哈希值。

当用户尝试登录时,会对其密码进行哈希处理,并与存储的哈希值进行比较。

所以在代码中,那就是:

void addNewUser(std::string name, std::string password)
{
    sometype hashValue = hashFunction(password);
    store(name, hashvalue); 
}

bool login(std::string name, std::string password)
{
    sometype hashValue = hashFunction(password);
    userdata = findUserData(name);
    if (userdata.hashValue == hashValue)
       return true;
    return false;
}

(显然,我已经忽略了一些复杂性,例如检查确实存在具有该名称的用户等)

编辑:当然,如果您需要以纯文本形式发送密码,则需要进行可逆加密。周围也有很多人。

此主题包括一般加密算法(并提及哈希): Top Hashing and Encryption Algorithms?

当然,这实际上取决于您要实现的目标,以及谁可以查看加密数据和密钥。如果您在本地计算机上存储东西,没什么大不了的,请使用一些对您有意义的加密,并将密钥存储在您正在编写的代码中。如果您的代码将被分发给其他可能对存储的密码感兴趣的代码,那么您将需要做更好的事情......而在这里,正如larsks在评论中所说,真正的问题是您正在分发密码和加密密钥和它的算法,所以任何可以进行一些逆向工程[或网络窥探]的人都可以获得密码。