Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
旧的python哈希从左到右进行-为什么不好?_Python_String_Cookies_Encryption_Hash - Fatal编程技术网

旧的python哈希从左到右进行-为什么不好?

旧的python哈希从左到右进行-为什么不好?,python,string,cookies,encryption,hash,Python,String,Cookies,Encryption,Hash,我正在努力学习如何抵御网站上的安全攻击。下面的链接显示了一个很好的教程,但有一句话让我感到困惑: 在中,在Cookie操作下,Gruyere说Pythons哈希是不安全的,因为它是从左到右哈希的 Gruyere应用程序正在使用此加密数据: # global cookie_secret; only use positive hash values h_data = str(hash(cookie_secret + c_data) & 0x7FFFFFF) c_数据是一个用户名;cooki

我正在努力学习如何抵御网站上的安全攻击。下面的链接显示了一个很好的教程,但有一句话让我感到困惑:

在中,在Cookie操作下,Gruyere说Pythons哈希是不安全的,因为它是从左到右哈希的

Gruyere应用程序正在使用此加密数据:

# global cookie_secret; only use positive hash values
h_data = str(hash(cookie_secret + c_data) & 0x7FFFFFF)
c_数据是一个用户名;cookie_secret是一个静态字符串,默认情况下为

我知道在更安全的散列函数中,一次更改会生成一个全新的结果,但我不明白为什么会出现这种不安全的情况,因为不同的c_数据会生成完全不同的散列


编辑:一个人怎样才能打败这样的一个杂烩呢?

我认为这只是一个不好的解释。Python的哈希是不安全的,因为很容易找到冲突,但从左到右的哈希与为什么很容易找到冲突无关。严格按顺序处理数据;它们可能一次操作128或256位数据,而不是一次操作一个字节,但这只是实现的一个细节

应该说,散列不安全在Python中不是一个bug,因为这不是它的目的。这是Python字典实现的一个公开细节,您通常不希望哈希表使用安全的哈希函数,因为这样会大大降低它的速度,从而无法达到目的。Python确实在模块中提供了安全的哈希函数


使用不安全的散列不是您显示的代码的唯一问题,但它是迄今为止最重要的问题。

我认为这只是一个不好的解释。Python的哈希是不安全的,因为很容易找到冲突,但从左到右的哈希与为什么很容易找到冲突无关。严格按顺序处理数据;它们可能一次操作128或256位数据,而不是一次操作一个字节,但这只是实现的一个细节

应该说,散列不安全在Python中不是一个bug,因为这不是它的目的。这是Python字典实现的一个公开细节,您通常不希望哈希表使用安全的哈希函数,因为这样会大大降低它的速度,从而无法达到目的。Python确实在模块中提供了安全的哈希函数


使用不安全的散列不是您显示的代码的唯一问题,但它是迄今为止最重要的问题。

Python针对所有类型的默认散列算法,但它对字符串的影响最为严重,因为通常为了安全而对字符串进行哈希处理的字符串是为了快速运行并在dicts的实现中表现良好。它不是一个加密哈希函数,你不应该为了安全而使用它。为此,请使用hashlib。

Python的默认哈希算法适用于所有类型,但它对字符串的影响最为严重,因为通常为安全而对字符串进行哈希处理的字符串旨在快速运行,并与dicts的实现配合得很好。它不是一个加密哈希函数,你不应该为了安全而使用它。为此请使用hashlib。

python内置函数不适用于安全的加密哈希。它的目的是帮助将Python对象高效地存储到字典中

对于安全使用,冲突太多太容易预测。例如,以下断言均为真:

hash('a') < hash('b')
hash('b') < hash('c')
hash('c') < hash('d')
这种顺序性使得字典存储行为非常出色,而它正是为此而设计的

要创建安全散列,请改用该库。

python内置函数不适用于安全的加密散列。它的目的是帮助将Python对象高效地存储到字典中

对于安全使用,冲突太多太容易预测。例如,以下断言均为真:

hash('a') < hash('b')
hash('b') < hash('c')
hash('c') < hash('d')
这种顺序性使得字典存储行为非常出色,而它正是为此而设计的


要创建一个安全的散列,请改用该库。

注释可能试图得出的结论是,对于大多数散列函数,如果给定了HASHm,那么就很容易计算HASHm。x、 对于任何x,在哪里。是串联


因此,如果您是用户ro,服务器会向您发送HASHsecret。ro,那么你可以很容易地计算HASHsecret。root,并以不同的用户身份登录。

注释可能试图得到的是,对于大多数哈希函数,如果给定了HASHm,那么就很容易计算HASHm。x、 对于任何x,在哪里。是串联


因此,如果您是用户ro,服务器会向您发送HASHsecret。ro,那么你可以很容易地计算HASHsecret。root,并以不同的用户身份登录。

可以通过将数据附加到正在散列的字符串的末尾并预测散列函数的输出来击败这样的散列。让我举例说明:

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> data = 'root|admin|author'
>>> str(hash('' + data) & 0x7FFFFFF);
'116042699'
>>> data = 'root|admin|authos'
>>> str(hash('' + data) & 0x7FFFFFF);
'116042698'
>>> 
空字符串是您提到的cookie秘密
它被指定为空字符串。在这个特定的示例中,虽然不是真正可以利用的,但是可以看到哈希值更改了1,数据的最后一个字节也更改了1。现在这个例子并不是真正的利用漏洞,忽略了这样一个事实,即创建一个anything|u这里的用户名| admin格式会使该用户成为admin,因为从左到右的用户名后面有一些数据,所以即使您创建的用户名非常接近被攻击的用户名,字符串的其余部分也会以完全不受欢迎的方式更改散列方式但是,如果cookie的形式是105770185 | user07而不是105770185 | user07 | author,那么您可以轻松创建一个用户user08或user06并计算预测哈希hometask:user08的哈希是什么

通过将数据附加到被散列的字符串的末尾并预测散列函数的输出,可以进行类似的散列运算。让我举例说明:

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> data = 'root|admin|author'
>>> str(hash('' + data) & 0x7FFFFFF);
'116042699'
>>> data = 'root|admin|authos'
>>> str(hash('' + data) & 0x7FFFFFF);
'116042698'
>>> 

空字符串是您提到的空字符串的cookie秘密。在这个特定的示例中,虽然不是真正可以利用的,但是可以看到哈希值更改了1,数据的最后一个字节也更改了1。现在这个例子并不是真正的利用漏洞,忽略了这样一个事实,即创建一个anything|u这里的用户名| admin格式会使该用户成为admin,因为从左到右的用户名后面有一些数据,所以即使您创建的用户名非常接近被攻击的用户名,字符串的其余部分也会以完全不受欢迎的方式更改散列方式但是,如果cookie的形式是105770185 | user07而不是105770185 | user07 | author,那么您可以轻松创建一个用户user08或user06并计算预测哈希hometask:user08的哈希是什么

本教程没有解释如何破解此漏洞。如何利用这一点?本教程没有解释如何破解。你是如何利用这一点的?我忘了提到,作为这个练习的一部分,是为了打败这个哈希实现,但我不明白如何利用你描述的弱点我忘了提到,作为这个练习的一部分,是为了打败这个哈希实现,但是我不明白如何利用你描述的弱点有没有关于如何破解这样的散列的想法?有没有关于如何破解这样的散列的想法?我不明白这是为什么。你的意思是Hashsecret+ro=Hashsecret+Hashro吗?@KaiserJohaan:他是指给定的Hashsecret。ro在散列的末尾再添加两个字符ot以计算HASHsecret很容易。根假设您想攻击用户BillyBob。如果您可以创建一个帐户作为用户B或用户Bi或用户Bil或。。。或者用户BillyBo,那么您就可以轻松地计算HASHsecret。只需获取服务器发送给您的散列,并将剩余字符添加到散列的末尾。通过将剩余字符添加到散列的末尾,例如对于BillyBob,您的意思是HASHsecret吗。比利波。HASHb?@KaiserJohaan:不,转换并没有那么简单,但几乎如此。我不明白为什么会有不同:我不明白这是为什么。你的意思是Hashsecret+ro=Hashsecret+Hashro吗?@KaiserJohaan:他是指给定的Hashsecret。ro在散列的末尾再添加两个字符ot以计算HASHsecret很容易。根假设您想攻击用户BillyBob。如果您可以创建一个帐户作为用户B或用户Bi或用户Bil或。。。或者用户BillyBo,那么您就可以轻松地计算HASHsecret。只需获取服务器发送给您的散列,并将剩余字符添加到散列的末尾。通过将剩余字符添加到散列的末尾,例如对于BillyBob,您的意思是HASHsecret吗。比利波。HASHb?@KaiserJohaan:不,转换并没有那么简单,但它几乎就是这么简单。我不明白为什么会有不同:S