Cryptography 困惑如何使用AES和HMAC

Cryptography 困惑如何使用AES和HMAC,cryptography,aes,hmac,Cryptography,Aes,Hmac,在将加密消息从服务器传输到客户端或从服务器传输到客户端时,我有点困惑如何正确使用AES和HMAC(基于SHA-256) 如果以下方法错误,请更正: 从密钥文件中获取安全密钥(例如,我们建议使用AES-256,并且我们已经有一个有效的256位长度密钥) 为AES-256生成随机IV,以确保相同的纯文本将具有不同的加密输出 使用纯文本和安全密钥计算HMAC-SHA-256。(第一个问题:我应该使用IV进行HMAC计算吗?例如,附加到安全密钥?) 使用AES-256加密纯文本 为客户端编写消息,如下所

在将加密消息从服务器传输到客户端或从服务器传输到客户端时,我有点困惑如何正确使用AES和HMAC(基于SHA-256)

如果以下方法错误,请更正:

  • 从密钥文件中获取安全密钥(例如,我们建议使用AES-256,并且我们已经有一个有效的256位长度密钥)
  • 为AES-256生成随机IV,以确保相同的纯文本将具有不同的加密输出
  • 使用纯文本和安全密钥计算HMAC-SHA-256。(第一个问题:我应该使用IV进行HMAC计算吗?例如,附加到安全密钥?)
  • 使用AES-256加密纯文本
  • 为客户端编写消息,如下所示:HMAC+IV+加密消息
  • 最大的问题是:是否有可能不向客户端发送IV,而是以相同的方式生成,并且仍然是加密安全的?或者也可以送静脉注射吗

    我以随机IV生成结束,因为需要相同的纯文本以不同的加密结果结束。

    不要发送hmac(消息),aes(消息)。如果你发送同一条信息两次,任何人都会知道。此外,您需要对密码文本进行mac访问,以防止攻击,例如

    IV:一般来说,处理IV的简单方法是在密码文本前加上前缀,因为它的长度是固定的。然后,您可以在解密之前读取这些字节。IV可以是公开的,但必须是随机的

    HMAC:如果您的库支持,最简单的方法是在GCM模式下使用AES(或者,不太理想的是EAX)。这实际上不是HMAC,但它提供了同样好的身份验证加密。如果不支持这些:

    您确实需要计算iv和密码文本上的hmac。如果| |是串联(如果处理字节数组,可以使用数组复制),那么您需要

    CipherText = iv|| aes(key1,iv,message)  
    tag = hmac(key2,ciphertext)
    
    然后发送(标签、密文)。在另一端,运行相同的hmac调用来重新生成标记,并将接收到的标记与计算出的标记进行比较。比较标签的sha1或sha256散列,而不是直接比较,这样在比较失败的地方就不会泄漏


    您应该为hmac使用不同的密钥。在实践中,对加密密钥的sha1和进行定位已经足够好了。

    您建议采用什么操作模式?CBC有它的开销,我们应该处理填充。我认为我的选择是ic OFB/CFB。从安全角度来看,它们都是一样的(除了欧洲央行,不要使用它)。如果系统需要静脉注射,请确保使用新的静脉注射。如果您想节省一些精力,可以使用不需要hmac的认证模式。GCM是其中最好的。您使用的是什么语言?我不建议将第一个键的SHA1和作为第二个键。相反,您可以从密码短语派生两个具有不同参数和PBKDF2的不同密钥。最好是有两个独立的密钥,不要依赖(可能)弱的密码短语。@Rafael为什么不建议使用第一个密钥的SHA1和?我知道这似乎有一些关系,但有什么具体的原因,为什么这是坏的?另外,为什么需要两个单独的密钥,一个用于AES,一个用于HMAC?我可以看出这可能很危险,但是关于这一点有什么具体的参考吗?请解释一下为什么AES和HMAC需要两个不同的密钥?蛮力方案可能针对HMAC,测试弱密码和PBKDF2,并将其与密文进行比较,如果它们匹配,则找到弱密码,并且可以使用它从密文中获取数据,因为您知道它是PBKDF2