2

在我的程序中,我们将用户的 IP 地址存储在记录中。当我们向用户显示记录列表时,我们不想泄露其他用户的 IP,因此我们对其进行 SHA1 哈希处理。然后,当用户单击记录时,它会转到如下 URL:

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

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

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

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

4

6 回答 6

8

不知道这是否重要,但您的SHA1哈希da39a3ee5e6b4b0d3255bfef95601890afd80709是空字符串的众所周知的哈希。

IP它只是一个示例还是您忘记向哈希计算函数提供实际地址?

更新:

您的网页代码是否生成SHA1小写的哈希?

此检查将失败MySQL

SELECT  SHA1('') = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709'

在这种情况下,使用这个:

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

,这将成功。

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

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并允许对 进行索引ip_sha,以便此查询可以快速运行。

于 2009-05-23T19:12:26.723 回答
4

我会将 IP 的 SHA1 与原始 IP 一起存储在数据库中,以便查询变为

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

然后我会确保 SHA1 计算恰好发生在代码中的一个地方,这样就没有机会在多个地方稍微不同地完成它。这也让您有机会将盐混合到计算中,这样人们就不能简单地计算他们感兴趣的 IP 地址上的 SHA1 并手动传递。

将 SHA1 哈希存储在数据库中还可以让您有机会在 ip_sha1 上添加二级索引以加速该 SELECT。如果您有一个非常大的数据集,则在 WHERE 子句中执行 SHA1 会强制数据库执行完整的表扫描,并在每次扫描时为每条记录重做计算。

于 2009-05-23T18:52:38.403 回答
3

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

于 2009-05-23T18:39:24.773 回答
3

Just a quick thought: that's a very simple obfuscation. There are only 232 possible IP addresses, so if somebody with technical knowledge wanted to figure it out, they could do that by calculating all 4 billion hashes, which wouldn't take very long. Depending on the sensitivity of those ip addresses, you may want to consider a private lookup table.

于 2009-05-23T19:42:07.273 回答
0

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

于 2009-05-23T18:38:29.177 回答
0

I ended up encrypting the IP addresses, and decrypting them on the other page. Then I can just use the raw IP address in the SQL query. Also, it protects against brute force attacks, like Autocracy said.

于 2009-05-23T19:56:46.387 回答