Hash 当输入是公共的时,是否有MD5哈希的替代方法?

Hash 当输入是公共的时,是否有MD5哈希的替代方法?,hash,md5,Hash,Md5,我有一个类似整数的数据库,因为它们都共享相同的前3个数字: 7537463746 7536735325 7538236775 7538273826 ... 每一个都与一个用户关联,它们几乎都公开,这意味着它们作为一种对等发现发送,而不是直接共享。我不希望裸整数是可访问的,所以我考虑使用单向散列函数对其进行散列,如 由于输出不像加密或压缩算法那样是可逆的,所以看起来很不错。但是有一个问题;获取整数数据库是很容易的,也是不可避免的,因此对它们进行循环,对循环结果进行散列,并将所有散列与通过对等通信

我有一个类似整数的数据库,因为它们都共享相同的前3个数字:

7537463746
7536735325
7538236775
7538273826
...
每一个都与一个用户关联,它们几乎都公开,这意味着它们作为一种对等发现发送,而不是直接共享。我不希望裸整数是可访问的,所以我考虑使用单向散列函数对其进行散列,如

由于输出不像加密或压缩算法那样是可逆的,所以看起来很不错。但是有一个问题;获取整数数据库是很容易的,也是不可避免的,因此对它们进行循环,对循环结果进行散列,并将所有散列与通过对等通信发送的散列进行比较,对于恶意用户来说将是一项微不足道的工作

模式如下所示:

user1[hash(integer1),hash(integer2)...] -> |server hash database| ->
                                                                    ↓
                                                                    ↓
                                               hash(integer1) = user8
                                              hash(integer2) = user40
恶意用户将通过社会工程或其他方式获取user1整数数据,并通过将它们添加到其对等数据中,对所有这些数据进行散列,以查看它们是否在数据库中


现在,有没有散列算法可以避免这种情况?我需要对等方在不给出整数数据的情况下进行通信,但它们仍然将同一个整数相互关联到一个唯一的散列。或者,密钥签名是唯一的解决方案吗?我想避免它,因为它会使整个系统变慢。

您是否考虑过添加MD5?这意味着您拥有某种只有您的应用程序才知道的密钥。事实上,这始终是一种良好的做法。所以与其这样做

md5($userId)
你会像这样在MD5里面加盐

md5($userId . 'this is a secret shhh!')

现在,他们无法从MD5中获取整数。

不幸的是,在我的情况下,我认为它没有添加任何类型的实际保护。即使我的应用程序被严重的模糊化和封闭源代码,只要有一点时间,任何人都可以拆解它并获得密钥。对于攻击者来说,这只是将整数与找到的salt进行哈希运算的问题。另一个选项是给出唯一的令牌而不是用户id。客户端将进行身份验证,您将返回一个唯一生成的令牌。他们会给你一个令牌,你可以在任何存储中查找它。。。会话、哈希表/缓存或数据库,以验证并获取其真实用户id。