2017-05-30 116 views
0

我有以下Python代码:SHA1哈希澄清

from hashlib import sha1 
secretString=b"this is the secret string" 
publicData=b"x10291434" 
hash=sha1(publicData+secretString).hexdigest() 

,如果我现在大众消费送出去的publicDatahash。这安全吗?我想检查一下,当用户提供publicData时,它与我原来用secretKey发送的hash相匹配。

我只是想确认我在做这个正确

+4

你应该使用正确的[HMAC构造](https://en.wikipedia.org/wiki/Hash-based_message_authentication_code) –

+1

Dan D说了些什么。使用标准[hmac](https://docs.python.org/3/library/hmac.html)模块中的任何hashlib散列函数都很容易。对于新代码,您可能会使用更强大的散列,例如SHA-256,但正如维基百科文章中提到的那样,HMAC构造抵抗简单MD5或SHA-1散列可能发生的各种攻击。 –

+0

Insterad使用HMAC,请参阅:[用于消息身份验证的键控哈希](https://docs.python.org/2/library/hmac.html#module-hmac)。 – zaph

回答

1

它看起来像你正在尝试做的HMAC

你应该尝试使用类似itsdangerous

>>> from itsdangerous import Signer 
>>> s = Signer('secret-key') 
>>> s.sign('my string') 
'my string.wh6tMHxLgJqB6oY1uT73iMlyrOA' 
>>> s.unsign('my string.wh6tMHxLgJqB6oY1uT73iMlyrOA') 
'my string' 
+0

谢谢Jakob如果我不想使用另一个库,我可以使用hashlib.pbkdf2_hmac生成HMAC吗? –

+1

@johhnyB'hashlib.pbkdf2_hmac'非常棒。请注意,它被设计成缓慢地作为强力攻击的障碍。根据您的应用程序,您可能不需要这么多的安全性,而简单的HMAC就足够了。 –

+0

嗨PM 2Ring是的,我宁愿在这种情况下超过安全速度。我只是读了关于hmac.new(key,msg = None,digestmod = None)的python函数。这会更快吗?如果密钥只是一个随机字符串,我认为是一个秘密密钥,这有什么关系吗?或者是否还必须以某种特殊方式生成密钥? –

-1

好,SHA-1不被认为是安全散列算法,因此没有,很不安全。

对于资金充足的对手,SHA-1不再被认为是安全的。 2005年,密码分析人员发现了对SHA-1的攻击,表明该算法可能不够安全,无法继续使用[4],并且自2010年以来,许多组织推荐使用SHA-2或SHA-3替代该算法[5] [6]。 [7]微软,[8]谷歌,[9]苹果[10]和Mozilla [11] [12] [13]都宣布,他们各自的浏览器将在2017年

源停止接受SHA-1的SSL证书:https://en.wikipedia.org/wiki/SHA-1

更多阅读:https://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html

+0

它足够安全,因为我读了你需要很多计算能力来打破它。而我在这里并没有处理非常敏感的信息。 –

+3

您在问题代码中使用SHA-1的方式是不安全的。但是,通过使用SHA-1作为HMAC中的散列,您可以轻松地使其变得安全。但正如我在对这个问题的评论中所说的,你也可以在HMAC中使用SHA-256。 –