首页 > 解决方案 > 奇怪的密码加密问题 C++ 任何类似的密码都可以使用,

问题描述

我有一个我无法弄清楚的问题,尽管我可能已经看了太久才知道它是什么。

我在数据库表中存储了 2 个密码字段,一个称为 PasswordHash (nvarchar(MAX)),一个 PasswordSalt(uniqueidentifier) 以及其他用户字段。

当用户第一次尝试长时间输入密码时,系统会使用以下 SQLCommand 将密码写入数据库:-

    asSQLCommand = "UPDATE YCR_User_Names SET PasswordHash = HASHBYTES(\'SHA2_512',\'";
    asSQLCommand = asSQLCommand + editPassword->Text;
    asSQLCommand = asSQLCommand + "\' + CAST(N\'";
    asSQLCommand = asSQLCommand + Sysutils::GUIDToString(gSalt);
    asSQLCommand = asSQLCommand + "\' AS NVARCHAR(36))) WHERE ID = ";
    asSQLCommand = asSQLCommand + sqlGetUser->FieldByName("ID")->AsInteger;

即它需要他们的密码,附加一个随机生成的PasswordSalt,然后加密很多。

当涉及到他们登录时,我使用以下 SQL 来检查密码是否匹配。

    asSQLCommand = "SELECT * FROM YCR_User_Names WHERE PasswordHash = HASHBYTES(\'SHA2_512',\'";
    asSQLCommand = asSQLCommand + editPassword->Text;
    asSQLCommand = asSQLCommand + "\' + CAST(N\'";
    asSQLCommand = asSQLCommand + sqlGetUser->FieldByName("PasswordSalt")->AsVariant;
    asSQLCommand = asSQLCommand + "\' AS NVARCHAR(36)))";

正如您所看到的(希望如此),它会检查用相同的盐加密相同的密码是否有效。

问题是,假设密码是“FredFlintstone”,那么只要前两个字符正确(Fr),它就会被接受。

你能看出我哪里做错了吗?

标签: c++hashpasswords

解决方案


我想通了,这是我测试时使用的密码!它一直有效,直到我击中!特点。我的 FredFlintstone 示例确实有效。

我不太担心数据本身,更重要的是阻止使用它的 8 个人像其他人一样乱搞,不存储敏感数据。


推荐阅读