验证依赖秘密密钥
发送方按规定算法和密钥计算消息标签,接收方用相应共享密钥检查它。知道公开算法但不知道密钥的一方,应难以为未经授权的新消息构造可通过的标签;这才是认证目标,不能只看两边算出的字符串是否碰巧相同。
公开校验和或无密钥哈希不具有同样条件:能替换消息的人通常也能重新计算公开摘要。MAC把受保护的秘密加入构造,但安全性仍依赖具体算法、密钥质量、标签长度和允许的使用量。
完整性认证与保密分开
消息可以明文发送并附带MAC,因此通过标签验证不意味着内容在传输途中被隐藏。若还需要保密,应采用承担加密职责的适当机制,或使用把两者结合的认证加密构造,而不是把MAC标签当成密文。
共享密钥也使MAC有别于公钥数字签名:能够验证的一方通常也能生成标签,不能仅凭这种标签向第三方证明究竟是哪位共享者写下了内容。账号身份、授权和需要何种证据,要由更完整的协议规定。
认证哪些字节仍由协议决定
MAC只覆盖送入算法的字节。若金额被认证而收款对象、请求类型或上下文没有纳入,标签不会自动保护那些遗漏信息;编码还须防止不同字段组合得到同一字节串。算法不能猜出业务上哪些字段应绑定。
一条原本有效的消息和标签被再次发送,仍可能通过同一数学检查。防重放需在协议中绑定并检查序号、挑战值或其他新鲜性条件,同时保存适当状态;仅仅加上一个时间字段却不核对其含义,也不构成完整机制。