哪些实现允许我检测失败的HMAC验证以检测主动攻击?

时间:2011-10-10 15:53:35

标签: encryption cryptography implementation hmac hmacsha1

我正在努力通过使用软件提醒并报告失败的authentication with encryption验证尝试以及与中层管理人员分享结果来提高对MAC的需求的认识。

我不是密码学家,但我看到正确实施的价值。理想情况下,我想创建一个报告,说X防攻击被阻止了。

这是一个有效的想法,还是过于简单?如果没有,我应该从哪里开始实施它? (低级AES,PGP等?)

2 个答案:

答案 0 :(得分:1)

这是一个C# MAC code sample,可以修改为在身份验证失败时发出警报或记录。这是一个不完整的样本,不应该按原样使用,因为在实施Authenticate-then-Encrypt (AtE)Encrypt-then-Authenticate (EtA)之前需要考虑许多其他细节

很高兴知道性能计数器,日志文件或DLL exception与此错误有关。我将调查BouncyCastle,看看相应的异常在哪里。

// Compares the key in the source file with a new key created for the data portion of the file. If the keys 
// compare the data has not been tampered with.
public static bool VerifyFile(byte[] key, String sourceFile)
{
    bool err = false;
    // Initialize the keyed hash object. 
    using (HMACSHA1 hmac = new HMACSHA1(key))
    {
        // Create an array to hold the keyed hash value read from the file.
        byte[] storedHash = new byte[hmac.HashSize / 8];
        // Create a FileStream for the source file.
        using (FileStream inStream = new FileStream(sourceFile, FileMode.Open))
        {
            // Read in the storedHash.
            inStream.Read(storedHash, 0, storedHash.Length);
            // Compute the hash of the remaining contents of the file.
            // The stream is properly positioned at the beginning of the content, 
            // immediately after the stored hash value.
            byte[] computedHash = hmac.ComputeHash(inStream);
            // compare the computed hash with the stored value

            for (int i = 0; i < storedHash.Length; i++)
            {
                if (computedHash[i] != storedHash[i])
                {
                    err = true;
                }
            }
        }
    }
    if (err)
    {
        Console.WriteLine("Hash values differ! Signed file has been tampered with!");
        // 
        // 
        // <-------- This is where the MAC alerting would go
        // 
        // 

        return false;
    }
    else
    {
        Console.WriteLine("Hash values agree -- no tampering occurred.");
        return true;
    }

} //end VerifyFile

答案 1 :(得分:0)

验证者无法根据他所拥有的信息确定密码是否有效的任何方法。唯一不允许您发出警报并报告失败的身份验证尝试的方案是身份验证尝试可能绕过服务器的方案。

例如,如果验证者是AES密钥(可以通过密码或密码短语生成),只需质疑验证代理加密或解密随机的128位字符串。攻击者获取的是一个随机的128位字符串。因此,要尝试查看特定密码是否有效,他必须向您发送回复,并且您可以记录错误的密码。