2013-04-11 362 views
1

我知道如何加密:我如何解密使用Python hashlib?

encrypted = hashlib.sha256('1234').hexdigest() 

,但我不知道如何解密这个?

decrypted = decrypt(encrypted) 
+3

这不是哈希的工作方式。一般来说,散列的整点是它不能被撤消。散列不是一种加密技术。 – BrenBarn 2013-04-11 19:16:12

+0

[wikipedia](http://en.wikipedia.org/wiki/Hash_function)有关于哈希的不错文章 – 2013-04-11 19:17:08

+0

想想看吧。如果你可以“解密”SHA256的非常短的32个字节的散列,你将有最终的压缩方法。但是,对于任何长于散列的数据,当然不能存在散列冲突,换句话说,产生相同散列的不同数据(但是使用像SHA256这样的密码安全散列,您实际上无法找到或创建冲突当前或可预见的计算机)。 – hyde 2013-04-11 19:22:05

回答

12

像SHA256哈希的一点是,它应该是一个单向函数(尽管真正的单向函数的存在仍是一个悬而未决的问题,请参见http://en.wikipedia.org/wiki/One-way_function)。

http://en.wikipedia.org/wiki/Cryptographic_hash_function

The ideal cryptographic hash function has four main properties: 

    1. it is easy to compute the hash value for any given message 
    2. it is infeasible to generate a message that has a given hash 
    3. it is infeasible to modify a message without changing the hash 
    4. it is infeasible to find two different messages with the same hash. 

如果你能扭转这种局面,那么你会被打破规则。这些规则允许一个告诉另一方,他们有一些信息(如密码),没有透露信息。例如,参见维基百科:http://en.wikipedia.org/wiki/Cryptographic_hash_function#Illustration

如果您需要可逆性看Simple way to encode a string according to a password?,你可以使用一些薄弱像Vignere,但也有使用PyCrypto一个例子:

from Crypto.Cipher import AES 
import base64 

cipher = AES.new(secret_key,AES.MODE_ECB) # never use ECB in strong systems obviously 
encoded = base64.b64encode(cipher.encrypt(msg_text)) 
# ... 
decoded = cipher.decrypt(baes64.b64decode(msg_text)) 

如果你想有一个可逆的哈希函数,看到Reversible hash function?

4

简短的回答是,你不能“解密”散列;它是一种单向函数。加密和散列之间有一个主要区别。

散列

http://en.wikipedia.org/wiki/Cryptographic_hash_function

注:这是可能的 'BREAK' 某些散列算法,但这不是解密。你会发现在链接的详细信息,以及为也被蟒蛇支持其他算法

加密

http://en.wikipedia.org/wiki/Encryption

散列的一个有用的例子是将密码存储在数据库中,而一个有用的加密示例是将您的银行详细信息发送到在线商店购买。

0

的哈希值,采用单向函数计算的,即它会给出一个特定的输入输出相同,但它仅仅是一个单向函数,不管你做什么,你不能解密。一个可以尝试通过蛮力解密它,即从字典计算的话哈希值,并将它与要解密的哈希值进行比较。 为了节省计算的字典中的单词的哈希值的时候,有彩虹表包含的话哈希在网上提供。

读:http://en.wikipedia.org/wiki/Rainbow_table

您还可以使用在线服务的哈希的蛮力解密。如果要解密的单词属于字典,则有很多可用的功能,并且效果很好。

1

这是一个有效的问题,也许不会带来正确不过。

OP,我想你要做的是检查一个哈希值与未哈希值?

hashed = hashlib.sha256('1234').hexdigest() 
hashedstring = '1234' + ',' + hashed 

现在检查散列==原始值。因此,在逗号前后解析出这一段。哈希1234并将其与哈希值进行比较。

def check_secure_val(h): 
    commapos = h.find(",") 
    val = h[0:commapos] 
    hashval = h[commapos+1:-1] 
    rehashval = hash_str(val) 
    if rehashval == hashval: 
     return val 

其中输入h是格式的字符串 “缬氨酸,(HASHEDSTRING)”

和hash_str是散列函数。

0

不是非常精确打个比方:加密是像一个人穿着伪装......采取哈希就像是走自己的指纹!

你可以通过去除/扭转伪装将“原始”人物带回来,但是你无法从一组指纹中做到这一点!