【问题标题】:SHA salt in MySQL queryMySQL查询中的SHA盐
【发布时间】:2011-03-09 04:38:00
【问题描述】:

我正在设置一个 cookie。比如:

$_COOKIE['test'] = SHA1('124'.'mysalt');

现在 124 是我想要的 id。所以在我的 MySQL 表中,我试图运行如下查询:

$sql = ("SELECT * FROM users WHERE SHA1(`id`) = '".mysql_real_escape_string($_COOKIE['test'])."'");

如何在 SQL 查询中添加“mysalt”?因为否则我想得到正确的 id。

【问题讨论】:

    标签: mysql sha1 salt


    【解决方案1】:

    使用可以使用Concat()

    SELECT ... Sha1( Concat(`id`, 'mysalt') )=...
    

    【讨论】:

    • 请记住:在这种情况下,MySQL 不能使用索引来加快搜索速度。向表中添加另一个字段可能会更好,因此您可以查询类似 SELECT ... WHERE id=124 AND tempkey='87gesafouvgbaesofiuigsaf'
    【解决方案2】:

    查询应该是:

    $sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,`mysalt`)) = '".mysql_real_escape_string($_COOKIE['test'])."'");
    

    如果我理解正确的话。

    【讨论】:

    • 在我回答的时间过长时没有检查新答案,我的错。
    • 这样做很丑陋,并且会导致性能崩溃,因为 users 表会增长,因为 MySQL 必须在每次执行请求时计算 SHA1(CONCAT('id', 'mysalt'))。考虑添加一个包含SHA1(CONCAT('id', 'mysalt')) 的新列id_hash,将其编入索引并将您的请求过滤置于id_hash = mysql_real_escape_string($_COOKIE['test'])
    【解决方案3】:

    已经提供的解决方案可能会很好用,但是您确定要这样做吗?如果字段“id”确实是一个独特的标识,您可以使用“LIMIT 1”来阻止 mysql 搜索您的所有项目。另一件事是,您为什么不为此使用单独的预计算字段?我的意思是在每个查询中,mysql 都不必要地计算所有这些 sha1 值。最后一件事。我不确定你为什么使用你的方法,但我最好的猜测是实现某种会话密钥。我认为这是一个坏主意,有几个原因:如果有人掌握了你的盐,他可以访问你的所有帐户。如果有人嗅到一个“会话”,他可以随时重复使用它。选择弱盐可能会产生严重的后果。 HTH。

    【讨论】:

      【解决方案4】:

      使用 CONCAT:

      $sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,'mysalt')) = '".mysql_real_escape_string($_COOKIE[''test''])."'");
      

      【讨论】:

      • OP为什么要使用concat?
      猜你喜欢
      • 2014-05-12
      • 2012-06-10
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      相关资源
      最近更新 更多