【问题标题】:How do I decrypt using hashlib in python?如何在 python 中使用 hashlib 解密?
【发布时间】:2013-04-04 03:07:43
【问题描述】:

我知道如何加密:

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

但我不确定,如何解密?

decrypted = decrypt(encrypted)

【问题讨论】:

  • 哈希不是这样工作的。通常,哈希的全部意义在于它无法撤消。散列不是一种加密技术。
  • wikipedia 有一篇关于哈希的好文章
  • 想想吧。如果您可以“解密”一个非常短的哈希(SHA256 为 32 个字节),您将拥有终极压缩方法。但是当然你不能,对于任何比散列长的数据,都存在散列冲突,换句话说,不同的数据会产生相同的散列(但是对于像 SHA256 这样的加密安全散列,你实际上无法找到或创建与当前或可预见的计算机)。
  • 为什么会存在冲突,举个简单的例子:en.wikipedia.org/wiki/Pigeonhole_principle
  • 从 sha1 取回原始字符串的唯一方法是暴力破解。任何散列函数都没有解密函数。这就是散列的全部意义所在。然而 sha1(small string) 可以被强制取回原始字符串。

标签: python hashlib


【解决方案1】:

像 sha256 这样的散列的意义在于它应该是一个单向函数(尽管真正的单向函数的存在仍然是一个悬而未决的问题,请参阅http://en.wikipedia.org/wiki/One-way_function)。

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

理想的密码散列函数有四个主要属性:

    1. 很容易计算任何给定消息的哈希值
    1. 生成具有给定哈希的消息是不可行的
    1. 在不更改哈希的情况下修改消息是不可行的
    1. 不可能找到两条具有相同哈希的不同消息。

如果您可以扭转它,那么您将违反规则 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?

【讨论】:

  • 加密函数说ValueError: Input strings must be a multiple of 16 in length
【解决方案2】:

简短的回答是您不能“解密”哈希;这是一种单向功能。加密和散列之间有一个主要区别。

散列

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

注意:可以“中断”某些哈希算法,但这不是解密。您将在链接中找到更多信息以及 python 也支持的其他算法

加密

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

示例

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

【讨论】:

    【解决方案3】:

    这是一个有效的问题,但可能没有正确提出。

    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 是格式为“val,(HASHEDSTRING)”的字符串

    hash_str 是一个哈希函数。

    【讨论】:

      【解决方案4】:

      不是很精确类比:加密就像一个伪装的人......取一个哈希就像取他们的指纹!

      你可以通过移除/反转伪装来找回“原始”人,但你不能从一组指纹中做到这一点!

      【讨论】:

      • 非常糟糕的类比
      • 是的,@AkshayLAradhya 如前所述,不是很准确。然而,考虑到问题所暗示的知识状态,它传达了期望与现实之间的不匹配程度。它并不打算解释散列或加密 - 只是它们之间的差异级别。所以这取决于你的期望;我的教学标准相当严格,但我认为我的“答案”会传达问题。
      【解决方案5】:

      哈希是使用单向函数计算的,即它会为特定输入提供相同的输出,但由于它只是一个单向函数,无论你做什么,你都无法解密它。可以尝试通过蛮力对其进行解密,即从字典中计算单词的哈希值并将其与要解密的哈希值进行比较。 为了节省计算字典单词哈希的时间,网上有彩虹表,其中包含单词的哈希。

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

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

      【讨论】:

        【解决方案6】:

        这可能有帮助吗?

        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()))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 1970-01-01
          • 2013-03-01
          • 2018-06-30
          • 1970-01-01
          • 2013-08-28
          • 2019-11-04
          相关资源
          最近更新 更多