首先,通过数学理论 - 是的(尽管在实践中,对于现代散列函数和在这个宇宙中可以通过计算实现的数字,您可以完全忽略这一点)。如果系统不以纯文本或可逆加密的形式存储您的密码,而是对其进行哈希处理(作为最佳实践),则有无限的潜在密码将生成与您的哈希匹配的哈希(假设理想的加密哈希功能)。
例如,如果您的密码是password = '!78ghA,NJ58*#3&*'
3 字节的盐,并且他们使用了加盐的 sha256 哈希(请注意,这应该通过多轮密钥加强,以使蛮力更难):d7 35 e6
那么您的密码哈希将是4fe5bbb74a21fb6d20785ce7fce1cd51d6fc87c5a55f65d75e8f37096ed54a53
(在 python 中,您可以计算这个):
>>> import hashlib
>>> salt = '\xd7\x35\xe6'
>>> password = '!78ghA,NJ58*#3&*'
>>> hashlib.sha256(salt + password).hexdigest()
'4fe5bbb74a21fb6d20785ce7fce1cd51d6fc87c5a55f65d75e8f37096ed54a53'
请注意,此哈希是 256 位。所以只有 2 256 ~ 10 77 个可能的哈希值。如果散列函数运行良好并且为所有可能的输入统一选择散列(即散列函数充当随机预言机),一旦您尝试显着超过 10 77 个散列,一些散列将发生冲突(可通过鸽洞原理证明)。如果您尝试了 10 80 个哈希,您应该期望找到大约 1000 个与任何给定哈希匹配的密码。
然而,10 77是一个非常大的数字。它大致是可观测宇宙中的原子数。或者,如果太阳系中的每个原子(~10 57 )每个原子每纳秒计算一次散列,那么在计算 10 77个散列之前大约需要 3000 年,所以这在实践中不必担心。
(如果您在 100 年内每秒尝试 50 亿次哈希,并且您有一些非常强的密码,那么随机找到与您的 256 位哈希匹配的不同密码的机会是 1 in 7.4 x 10 57;这就像购买的几率连续几周获得 7 张强力球彩票,前 6 次中奖,然后第 7 次投注并匹配 5 个号码(无强力球),仅赢得 100 万美元。)
当然,这并不意味着实际上您的密码是唯一的。我个人在野外遇到了一个部署的 Cisco VPN 系统,该系统将 12 个字符的随机密码截断为 8 个字符,而没有通知用户(我最初发现当我输入得太快并且遗漏了一个字符时它仍然有效;然后做了试验和错误)。因此,只要前 8 个字符是正确的,那么您可以在之后输入任何您想要的内容,它就会起作用。
这也不是孤立的情况。例如,微软过去常常默默地将 Windows Live ID 密码截断为 16 个字符,尽管它现在通知用户它将密码限制为 16 个字符:
Windows Live ID 密码始终限制为 16 个字符——登录过程会忽略任何额外的密码字符。当我们将“Windows Live ID”更改为“Microsoft 帐户”时,我们还更新了登录页面,让您知道密码的前 16 个字符是必需的。”
设计不佳的身份验证系统也可能会从您的密码中间去除特殊字符。我的朋友在 2011 年发现 T-Mobile 这样做了,当时他使用了设计不佳的“忘记密码”功能,该功能以明文形式向他发送密码,在他的情况下,他从密码中删除了特殊字符。