c++ - 奇怪的密码加密问题 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),它就会被接受。
你能看出我哪里做错了吗?
解决方案
我想通了,这是我测试时使用的密码!它一直有效,直到我击中!特点。我的 FredFlintstone 示例确实有效。
我不太担心数据本身,更重要的是阻止使用它的 8 个人像其他人一样乱搞,不存储敏感数据。
推荐阅读
- java - 如何在片段中获取动态创建的 EditText 数据?
- python - 如何使用pyodbc连接执行.sql文件
- azure - ORA-01555: 快照太旧:名称为“”的回滚段号太小声纳 qube
- python - LXML 命名空间前缀
- c++ - 移动 unique_ptr 与使用 get()?
- python-3.x - Django Rest Framework 不保存所有外键对象
- java - 核心池大小 0 和无界的linkedblockingqueue
- spring - 将多个 application.yml 从工作目录绑定到 ConfigurationProperties
- android - HILT 是否支持注入泛型类型?
- gcc - make 的 -j 参数必须与核心数完全相同吗?