如何在数据库中以加密形式保存字符串(用户名密码),并在用户登录时解密

时间:2011-03-24 06:55:24

标签: c++ authentication

大家早上好,
我正在使用c ++并使用wxWidget,在后端我使用MySql,我想在数据库中以加密形式保存用户名和密码,
当用户尝试登录时,我将解密数据进行身份验证,
c ++中是否有可以处理加密或解密的头文件?

5 个答案:

答案 0 :(得分:11)

不要加密密码,不希望人们的密码可以恢复。如果他们忘记了密码,请将密码重置为其他密码。不要存储可用于获取原始密码的密码或加密密码。

你应该做的是:

  • 生成随机salt
  • 将salt值附加或添加到用户密码中。
  • Hash密码和盐的组合(使用强大的东西,如SHA256)。
  • 将用户名,散列值和salt存储在数据库中。

当用户尝试登录时:

  • 加载与用户名关联的salt值。
  • 将盐添加或提供(即,与注册时相同)盐到提供的密码。
  • 散列组合,将其与存储的散列进行比较。如果它们不同,则登录失败。

答案 1 :(得分:2)

首先,在加密方面,您不希望加密用户名,否则您将无法查找它们。但是,密码是正确的,应加密存储,因为如果您的数据库遭到入侵,您不希望人们访问每个人的密码。

但是,通常情况下,您不会加密密码并对其进行解密以进行身份​​验证。你哈希他们。您获得hash function(例如SHA-256)并通过该功能运行密码。例如,如果我的密码是“双筒望远镜”,我通过SHA-256运行并获取:

a0e23a0813c2b152222f28830be966f4eb0fd8ccbb4b487b7688c2749e754a72

(这是一个二进制字符串,以十六进制表示),因此您将上述字符串存储在数据库中。请注意,如果有人抓住该字符串,则绝对无法确定我的原始密码是“双筒望远镜”。

现在,当我进行身份验证时,我提供了密码“binoculars”并通过哈希算法运行它并获得与上面完全相同的字符串 - 因此它是正确的密码。如果我提供了任何其他密码,它将哈希到另一个字符串,我无法登录。

现在进入图书馆。有许多不同的库可以为您提供散列函数,如SHA-256。您可以尝试的是Crypto++。我推荐SHA-256。 MD5和SHA-1是较旧的哈希函数,可能存在加密缺陷; SHA-256没有已知的加密缺陷。

答案 2 :(得分:1)

您不会解密来自MySQL的数据,而是加密提供给用户的数据。然后将它与MySQL中的那个进行比较。

哈希算法并不是可解密的。

编辑:把我的评论集中在散列上。

答案 3 :(得分:0)

除此之外,保存加密密码不是最佳选择,因为这意味着您仍然可以从存储在数据库中的信息中计算出原始密码。通常的做法是保存密码的盐渍哈希值,当用户登录时,将存储的盐渍哈希值与他们尝试登录时使用的密码计算出来。

答案 4 :(得分:0)

解密需要什么?

加密用户名和密码将其存储在表

然后加密输入的用户名和密码比较