我有一个在 Python 中使用 SHA-1 加密的函数,使用hashlib
. 我拿一个文件并用这个哈希加密内容。
如果我为加密的文本文件设置了密码,我可以使用该密码来解密并使用原始文本恢复文件吗?
我有一个在 Python 中使用 SHA-1 加密的函数,使用hashlib
. 我拿一个文件并用这个哈希加密内容。
如果我为加密的文本文件设置了密码,我可以使用该密码来解密并使用原始文本恢复文件吗?
SHA-1
不是加密算法,而是散列算法。根据定义,你不能“解密”任何用 SHA-1 函数散列的东西,它没有逆函数。
如果您有一个任意散列密码,那么您几乎无法检索原始密码 - 如果幸运的话,密码可能在反向散列数据库中,但这是您所能做到的。
并且消息提取算法期望原始密码执行验证 - 该算法将散列提供的纯文本密码并将其与存储的散列密码进行比较,只有当它们相等时才会显示纯文本消息。
散列函数不同于普通的加密算法。它们通常被称为单向密码,因为经过的过程数据是不可逆的。
与对称和非对称加密不同,散列是通过断言散列值本身来使用的,而不是解密和断言纯文本值。要在使用哈希时验证登录,您需要对用户刚刚尝试登录的密码进行哈希处理,并将其与数据库中的哈希进行比较。如果它们匹配,则登录成功。
破解散列涉及猜测散列各种不同的字符串,并尝试将散列值与从数据库中非法获取的值匹配。互联网上有数百万个已经散列值的列表可以使散列破解更容易,这些被称为彩虹表,可以使用Salts轻松应对。
还值得注意的是,由于散列算法能够将 GB 的数据消化成小得多的字符串,因此在数学上,两个不同的值可能具有相同的散列。尽管这种情况非常罕见,但它是一个存在的问题,它被称为Hash Collision。
如果散列是可逆的,那么硬盘驱动器将是多余的,因为我们可以将数千 GB 的数据散列成一小段文本,然后随意反转它们。它将允许以违反物理学的方式进行数据压缩和存储。
相关维基百科文章:
哈希算法:http ://en.wikipedia.org/wiki/Hash_function
彩虹表:http ://en.wikipedia.org/wiki/Rainbow_table
盐:http://en.wikipedia.org/wiki/Salt_(密码学)
碰撞:http://en.wikipedia.org/wiki/Collision_(computer_science)
哈希函数是一种方式票。您不能将它们用于加密。
哈希函数算法是通过取模、异或和其他熟悉的(单向)运算来实现的。
您可能会尝试找出用于生成哈希的参数,但理论上您永远不会 100% 确定它是正确的值。
例如,尝试使用一个非常简单(在密码学中无用)的散列函数模 10。该函数返回十个不同的值。如果它是 7,您可能会猜到该条目是 7 或 137 和 1234567。与 md5、sha1 和更好的相同。
如您所见,如果您使用的哈希函数仅返回 40 个字节,而文件更大(甚至可能是几百兆字节),理论上每个可能的哈希值都存在无限数量的文件。