我知道如何加密:
encrypted = hashlib.sha256('1234').hexdigest()
但我不确定如何解密这个?
decrypted = decrypt(encrypted)
答案 0 :(得分:19)
像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.
如果您可以撤消它,那么您将违反规则2.这些规则允许人们告诉另一方他们有一些信息(例如密码),而不会泄露信息。例如,请参阅维基百科: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?
答案 1 :(得分:5)
简短的回答是你不能'解密'哈希;它是单向函数。加密和散列之间存在重大差异。
<强>散列强>
请参阅http://en.wikipedia.org/wiki/Cryptographic_hash_function
注意:可以“BREAK”某些哈希算法,但这不是解密。您可以在链接中找到更多信息以及python
也支持的其他算法<强>加密强>
和http://en.wikipedia.org/wiki/Encryption
示例强>
散列的有用示例是将密码存储在数据库中,而加密的一个有用示例是将您的银行详细信息发送到在线商店以购买东西。
答案 2 :(得分:1)
这是一个有效的问题,但可能没有正确提出。
OP,我认为你要做的是检查一个未散列的哈希值?
hashed = hashlib.sha256('1234').hexdigest()
hashedstring = '1234' + ',' + hashed
现在检查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是格式为“val,(HASHEDSTRING)”的字符串
和hash_str是哈希函数。
答案 3 :(得分:0)
哈希是使用单向函数计算的,即它将为特定输入提供相同的输出,但由于它只是单向函数,无论你做什么,都无法解密它。可以尝试通过强力解密它,即从字典计算单词的散列并将其与您想要解密的散列进行比较。 为了节省计算字典单词哈希值的时间,在线提供了彩虹表,其中包含带有单词的哈希值。
阅读:http://en.wikipedia.org/wiki/Rainbow_table
您还可以使用在线服务对哈希进行强力解密。如果要解密的单词属于字典,那么有很多可用并且运行良好。
答案 4 :(得分:0)
不是非常精确的类比:加密就像穿着伪装的人......拿哈希就像拿指纹一样!
你可以得到&#34;原作&#34;通过移除/扭转伪装来回复人,但你不能从一组指纹中做到这一点!
答案 5 :(得分:0)
这可能有帮助吗?
import hashlib
l = ["riyad", "onni", "arman"]
def check_user(h):
for i in l:
if h == hashlib.md5(i.encode('utf-8')).hexdigest():
return i
print(check_user(hashlib.md5(l[2].encode('utf-8')).hexdigest()))