【问题标题】:Check a field in MySql from a php md5 string从 php md5 字符串检查 MySql 中的字段
【发布时间】:2009-11-19 16:44:17
【问题描述】:

我正在尝试通过 md5 函数从我的 php 页面验证 mysql 上的一对数据列。
我已经使用 php md5 函数加密了字符串 "helloworld" 并尝试将其与 MYSQL MD5 函数进行比较,但它不起作用。
我这样做是因为在数据库中有一对字符串 "hello""world" 需要与我的 php 字符串进行比较,所以:

<?php
$str_a = "hello";
$str_b = "world";
$str_encrypted = md5 ($str_a.$str_b);

// note "first_col" is "hello" and "second_col" is "world"
$sql = "UPDATE `my_table` SET `checked_col` = '1' WHERE MD5(CONCAT(first_col,second_col)) = '$str_encrypted' LIMIT 1;";
$res = mysql_query ($sql) or die (mysql_error());

($res) ? print "true" : print "false";
?>

这段代码返回false,数据库不UPDATEchecked column,但不返回mysql_error问题。

php 的 md5 能否从 MYSQL 生成不同的 MD5

一个朋友写的类似代码在同一台服务器上工作,但我不需要太多经验就能看出区别在哪里

谁能解释我哪里错了?
谢谢!

【问题讨论】:

  • 不确定你的问题是什么,但我会选择一种更透明的调试方式。自己验证流程的每一部分,而不是假设事情按预期工作。所以首先输出 $str_a.$str_b 和 CONCAT(first_col,second_col) 并确保它们是相同的输入,正如你所期望的那样。然后对它们进行 MD5 并直观地验证它们是否评估为相同的东西......等等,这样您就可以验证每一步都按预期工作。
  • 谢谢,如果您认为查询应该有效,我会从头重新检查!
  • P.S.我听说这些天 MD5 几乎是一种破解加密(至少如果你不播种哈希或者你不做嵌套的 md5 调用,比如 md5(md5(md5('password'))) ),所以请记住,使用裸 md5() 函数调用可能比安全加密更适合净化数据存储,您可能希望使用其他方法。
  • 太棒了!你是对的!感谢您的帮助

标签: php mysql md5 compare


【解决方案1】:

我不会混合和匹配 MD5 函数。将任何 md5 函数视为单向街道可能更简单。所以修改为:

$str_concat = $str_a.$str_b;

// note "first_col" is "hello" and "second_col" is "world"
$sql = "UPDATE `my_table` SET `checked_col` = '1' WHERE
     MD5(CONCAT(first_col,second_col)) = MD5('$str_concat') LIMIT 1;";

为了简单起见,或者只是让 sql 完全匹配。

// Skip the php concatenation.

// note "first_col" is "hello" and "second_col" is "world"
$sql = "UPDATE `my_table` SET `checked_col` = '1' WHERE 
    MD5(CONCAT(first_col,second_col)) = MD5(CONCAT('$str_a','$str_b')) LIMIT 1;";

【讨论】:

  • 这是我从未有过的好主意!
    不幸的是,我无法使用这个智能解决方案,因为我的 php md5 字符串来自电子邮件,例如激活码,所以我需要先用php md5隐藏字符串,通过email发送,然后从查询页面查看。
【解决方案2】:

MySQL 中的MD5PHP 中的MD5 函数返回不同哈希的唯一方法是MySQL 中的character set 不同。

【讨论】:

    【解决方案3】:

    尝试运行以下查询:

    SELECT  MD5(CONCAT(first_col,second_col))
    FROM    mytable
    WHERE   first_col = 'hello'
            AND second_col = 'world'
    

    并确保它返回fc5e038d38a57032085441e7fe7010b0

    还要检查PHPMySQL 返回的MD5 的大小写是否匹配。

    【讨论】:

      【解决方案4】:

      您的 $res 很可能是错误的,因为没有要更新的内容。如果您之前运行过 SQL 命令并更新了该行,则如果 checked_col 仍为 1,它将不会再次更新。由于 mysql_query 不更新任何内容,因此它将返回 false。

      您可以包含一个 where 子句来忽略以前检查(验证)的行。

      您可能不想使用更新的结果来确定验证是否成功,也许您想改用 select。

      【讨论】:

        【解决方案5】:

        ** 我找到的唯一解决方案是使用 php 函数库的 md5 哈希部分插入密码(或更新表),这样当您将哈希与它工作的数据库进行比较时。将 php 中的 md5 哈希与 mySQL 的 md5 函数匹配的所有其他尝试均失败。

        如果有人知道为什么(我相信旧版本的 php 和 mysql 没有这个问题)会发生这种情况,我很想知道 - 谢谢,rick

        【讨论】:

          猜你喜欢
          • 2015-10-24
          • 2021-01-15
          • 1970-01-01
          • 1970-01-01
          • 2017-03-18
          • 2011-10-13
          • 2014-11-25
          • 2012-02-15
          • 1970-01-01
          相关资源
          最近更新 更多