gpt4 book ai didi

ruby - 为什么 Ruby #hash 方法是随机的?

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:40 25 4
gpt4 key购买 nike

我刚刚注意到每次启动 Ruby 时 #hash 的返回值都会改变:

$ irb
2.0.0-p353 :001 > "".hash
2313425349783613115
2.0.0-p353 :002 > exit

$ irb
2.0.0-p353 :001 > "".hash
4543564897974813688
2.0.0-p353 :002 > exit

我查看了 MRI 源以了解发生这种情况的原因:

st_index_t
rb_str_hash(VALUE str)
{
int e = ENCODING_GET(str);
if (e && rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT) {
e = 0;
}
return rb_memhash((const void *)RSTRING_PTR(str), RSTRING_LEN(str)) ^ e;
}

原来rb_memhash是在random.c中定义的:

st_index_t
rb_memhash(const void *ptr, long len)
{
sip_uint64_t h = sip_hash24(sipseed.key, ptr, len);
#ifdef HAVE_UINT64_T
return (st_index_t)h;
#else
return (st_index_t)(h.u32[0] ^ h.u32[1]);
#endif
}

虽然我找不到 ruby_sip_hash24 是什么,但我认为它不是确定性函数。

经过一番折腾,我设法找到了this commit由于“避免算法复杂性攻击”,Tanaka Akira 将 rb_str_hash 更改为使用 rb_memhash。这是什么意思?

谢谢!

最佳答案

正如提交信息所说,这是为了避免 algorithmic complexity attacks .

An algorithmic complexity attack is a form of computer attack that exploits known cases in which an algorithm used in a piece of software will exhibit worst case behavior. This type of attack can be used to achieve a denial-of-service.

通过使用 rb_memhash,每次启动新的 ruby​​ 执行上下文时,哈希结果都会随机化。否则,如果不是随机的,攻击者知道算法并且可以找出最坏情况下的行为,可以用作 DoS 攻击。

关于ruby - 为什么 Ruby #hash 方法是随机的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com