Cyan's Blog

Search

Search IconIcon to open search

Hash函数_Pt.1_数据完整性

Last updated Unknown Edit Source

# 4.1 Hash 函数与数据完整性

Hash 函数的主要目的就是为了保持数据的完整性 与"加密"不同, hash函数的目的不是为了让一个消息对其他人"不可知,不可理解", 而是为了保证这条信息没有被篡改, 为了"不变质"地保存一条信息, 即保持这条信息原来的模样

Hash函数有两种, 一种是带密钥的, 一种是不带密钥的, 两种在应用场景上有一些区别

不带密钥的Hash函数可以在一段时间内验证数据的完整性。 想象一个Oracle(先知, 谕示器), 你提供给他一条信息, 她总会返回给你一个独特的信息,通过比对这个信息,你就能够知道自己的信息从上次询问到现在之间是否被篡改了(但是这个信息本身并没有什么实际含义)

注意, 你必须要安全的保存 $y=h(x)$, 否则坏蛋可以同时更换你的 $x$ -> $x^\prime$ 和 $y$ -> $y^\prime=h(x^\prime)$, 你在询问的时候依然有 $h(x^\prime)=y^\prime$, 满足校验条件.

带密钥的Hash函数则可以在通讯中保证数据的完整性(Message_Authentication_Code,MAC, 消息校验码) 你和 Bob 都事先约定好了一个密钥 K,通过这个密钥 K 可以生成对应的 Hash 函数 $h_k$, 你在与 Bob 通讯的时候,同时发送消息 $x$ 和 $y=h_k(x)$, 这样 Bob 在收到消息后便可以校验 x 和 y 是否对应, 以此来判断消息是否被篡改了

注意, 你必须要确信消息的确来自 Bob, 否则坏蛋仍然可以同时伪装成 Bob 向你发送 $x^\prime$ 和 $y^\prime$, 这依然满足校验条件