鉴于密钥已知,是否有一种方法可以从 HMAC SHA-1 中的密文中获取纯文本?

信息安全 加密 密码学 hmac 密码分析
2021-09-07 05:46:49

从技术上讲,这甚至不是攻击。我们手头有所有资源,除了原始的纯文本。我们有密文(要转换回纯文本)以及密钥。

DB中存储的密文如下: HKnvB41kkow+KkR4c7G/8vusmEM=

使用的哈希函数如下:

Public Shared Function EncryptPasswordInHash(ByVal password As String) As String
    Dim EncodedPassword As String = password
    Dim Hash As New HMACSHA1()
    Hash.Key = StrToByte(LicensingBLL.ENCRYPTION_KEY)
    EncodedPassword = Convert.ToBase64String(Hash.ComputeHash(Encoding.Unicode.GetBytes(password)))
    Return EncodedPassword
End Function

我们使用的密钥是:“zooooooooooo123”

有没有可能的方法来检索所有给定信息的明文?

1个回答


一般来说:不。散列不是加密。散列是不可逆的。完全没有。它总是生成一个固定长度的输出。因此,如果输出固定为 32 个字符,输入为 33 个字符,则无法逆转这种情况。那个角色的信息已经无法挽回地丢失了。- 以及所有其他角色。

蛮力对于小输入是可行的
但是:如果你知道,你的输入只有数字 0-9 并且只有 3 个,那么你只需尝试所有 1000 个,是的,你已经有效地反转了哈希。(通过“蛮力”。)

没有解锁键控散列
另外:您在键控散列中使用的“键”不是那种可以解锁任何东西的键。在这种情况下,“钥匙”确实是一个糟糕的、令人困惑的名字。它只是一个以特殊方式与常规数据混合的输入。-- 之后全部经过哈希函数绞肉机,变成定长输出。

旁注:存储密码的奇怪方式
您似乎正在使用 HMAC 来存储密码。这是不寻常的。这也意味着您基本上存储的是胡椒粉、无盐、低轮数哈希密码。胡椒粉很好。(如果辣椒存储在哈希本身以外的其他地方。)无盐总是不好的。低轮数散列也很糟糕。(详细信息:请参阅此问题:HMAC -Why not HMAC for password storage?)——如果密钥已知,所有这些都将使暴力破解哈希变得更容易,但仍然必须暴力破解。