【问题标题】:Hashing a value in a trigger is different than hashing outside it MySQL在触发器中散列值不同于在它外部散列 MySQL
【发布时间】:2018-10-03 00:25:56
【问题描述】:

一个奇怪的问题不知道如何解决。 我无法根据存储在数据库中的散列密码验证用户密码

在 MySQL 中,在插入用户数据之前,我对密码进行哈希处理,然后将其存储在用户表中,但是当用户尝试使用相同的密码登录时,我在将用户密码与用户中已经哈希过的密码进行哈希处理后检查用户密码表结果不一样

这里是触发器

DELIMITER $$
DROP TRIGGER IF EXISTS validateNewUserInsert$$
CREATE DEFINER=`evolve`@`localhost`  TRIGGER `validateNewUserInsert`
BEFORE INSERT ON user FOR EACH ROW
BEGIN
    CALL validateNewUser(NEW.username, NEW.user_email);

    SET NEW.password = sha2(123, 256); 


END$$
DELIMITER ; 

例如: '123' 触发器中散列的结果是 a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa

================================================ ====

select sha2('123', 256);

但是在触发器外部对相同输入“123”进行散列时的结果是 a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3

为什么不一样?当他尝试登录时,我如何验证用户输入

【问题讨论】:

    标签: mysql hash


    【解决方案1】:

    你需要检查NEW.password的长度

    trigger 中的结果是

    a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa

    sha2 直接计算的结果是

    a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3

    第一个字符串的长度是45,第二个是64,而且第一个字符串是第一个字符串的子字符串,所以你需要检查NEW.password是否由于长度限制而截断了值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-25
      • 2012-12-27
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 2021-06-23
      相关资源
      最近更新 更多