代码之家  ›  专栏  ›  技术社区  ›  Isaac Waller

SQL应该在哪里

  •  2
  • Isaac Waller  · 技术社区  · 17 年前

    在我的程序中,我们将用户的IP地址存储在一个记录中。当我们向一个用户显示一个记录列表时,我们不想泄露另一个用户的IP,所以我们应该哈希它。然后,当用户单击一条记录时,它会转到如下URL:

    http://www.example.com/allrecordsbyipaddress.php?ipaddress=SHA1HASHOFTHEIPADDRESS
    

    现在,我需要按sha1哈希中指定的IP地址列出所有记录。我试过这个:

    SELECT * FROM records 
    WHERE SHA1(IPADDRESS)="da39a3ee5e6b4b0d3255bfef95601890afd80709"
    

    但这不起作用。我该怎么做?
    谢谢, 艾萨克沃勒

    6 回复  |  直到 17 年前
        1
  •  4
  •   Dave W. Smith    17 年前

    我将把IP的sha1和原始IP一起存储在数据库中,这样查询就会变成

    SELECT * FROM records WHERE ip_sha1 = "..."
    

    然后我会确保sha1计算发生 只有一个地方 在代码中,这样就没有机会在多个地方执行稍微不同的操作。这也给了你一个在计算中混合使用salt的机会,这样别人就不能简单地在他们感兴趣的IP地址上计算sha1并手工传递它。

    存储sha1散列数据库还让您有机会在ip_sha1上添加一个二级索引,以加快选择速度。如果您有一个非常大的数据集,那么在WHERE子句中执行SHA1将强制数据库执行完整的表扫描,并为每次扫描中的每个记录重新进行计算。

        2
  •  8
  •   Quassnoi    17 年前

    不知道是否重要,但是 SHA1 搞砸 da39a3ee5e6b4b0d3255bfef95601890afd80709 是空字符串的已知哈希。

    只是一个例子,还是你忘了提供一个 IP 哈希计算函数的地址?

    更新:

    你的网页代码生成了吗 沙哈 小写散列?

    这张支票不能兑现 MySQL :

    SELECT  SHA1('') = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709'
    

    在这种情况下,请使用:

    SELECT  SHA1('') = LOWER('DA39A3EE5E6B4B0D3255BFEF95601890AFD80709')
    

    会成功的。

    此外,您还可以预先计算 沙哈 在表中插入记录时哈希:

    INSERT
    INTO    ip_records (ip, ip_sha)
    VALUES  (@ip, SHA1(CONCAT('my_secret_salt', @ip))
    
    SELECT  *
    FROM    ip_records
    WHERE   ip_sha = @my_salted_sha1_from_webpage
    

    这会把原件还给你 知识产权 并允许索引 ip_sha ,以便此查询快速工作。

        3
  •  3
  •   Bill Karwin    17 年前

    每次我遇到意外的散列不匹配时,都是因为我不小心散列了一个包含一些空白的字符串,例如“ \n “。

        4
  •  3
  •   Jeff Ferland    17 年前

    只是一个快速的想法:这是一个非常简单的混淆。只有2个 三十二 可能的IP地址,所以如果有技术知识的人想知道它,他们可以通过计算所有40亿哈希来实现,这不会花费很长时间。根据这些IP地址的敏感性,您可能需要考虑使用私有查阅表格。

        5
  •  0
  •   Andomar    17 年前

    您是否将哈希算法的输出与mysql的sha1()的输出进行了比较?例如IP地址1.2.3.4?

        6
  •  0
  •   Community Mohan Dere    9 年前

    我最后对IP地址进行了加密,并在另一页上对其进行了解密。然后我可以在SQL查询中使用原始IP地址。此外,它还可以防止暴力攻击,比如 Autocracy 说。