我知道如何加密:我如何解密使用Python hashlib?
encrypted = hashlib.sha256('1234').hexdigest()
,但我不知道如何解密這個?
decrypted = decrypt(encrypted)
我知道如何加密:我如何解密使用Python hashlib?
encrypted = hashlib.sha256('1234').hexdigest()
,但我不知道如何解密這個?
decrypted = decrypt(encrypted)
像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?
簡短的回答是,你不能「解密」散列;它是一種單向函數。加密和散列之間有一個主要區別。
散列
見http://en.wikipedia.org/wiki/Cryptographic_hash_function
注:這是可能的 'BREAK' 某些散列算法,但這不是解密。你會發現在鏈接的詳細信息,以及爲也被蟒蛇支持其他算法
加密
和http://en.wikipedia.org/wiki/Encryption
例
散列的一個有用的例子是將密碼存儲在數據庫中,而一個有用的加密示例是將您的銀行詳細信息發送到在線商店購買。
的哈希值,採用單向函數計算的,即它會給出一個特定的輸入輸出相同,但它僅僅是一個單向函數,不管你做什麼,你不能解密。一個可以嘗試通過蠻力解密它,即從字典計算的話哈希值,並將它與要解密的哈希值進行比較。 爲了節省計算的字典中的單詞的哈希值的時候,有彩虹表包含的話哈希在網上提供。
讀:http://en.wikipedia.org/wiki/Rainbow_table
您還可以使用在線服務的哈希的蠻力解密。如果要解密的單詞屬於字典,則有很多可用的功能,並且效果很好。
這是一個有效的問題,也許不會帶來正確不過。
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是散列函數。
不是非常精確打個比方:加密是像一個人穿着僞裝......採取哈希就像是走自己的指紋!
你可以通過去除/扭轉僞裝將「原始」人物帶回來,但是你無法從一組指紋中做到這一點!
這不是哈希的工作方式。一般來說,散列的整點是它不能被撤消。散列不是一種加密技術。 – BrenBarn 2013-04-11 19:16:12
[wikipedia](http://en.wikipedia.org/wiki/Hash_function)有關於哈希的不錯文章 – 2013-04-11 19:17:08
想想看吧。如果你可以「解密」SHA256的非常短的32個字節的散列,你將有最終的壓縮方法。但是,對於任何長於散列的數據,當然不能存在散列衝突,換句話說,產生相同散列的不同數據(但是使用像SHA256這樣的密碼安全散列,您實際上無法找到或創建衝突當前或可預見的計算機)。 – hyde 2013-04-11 19:22:05