2013-04-11 134 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

不是非常精確打個比方:加密是像一個人穿着僞裝......採取哈希就像是走自己的指紋!

你可以通過去除/扭轉僞裝將「原始」人物帶回來,但是你無法從一組指紋中做到這一點!