🧮 BS ISO/IEC 10118 是英国标准协会(BSI)采用的 ISO/IEC 10118 国际标准系列,由技术委员会 IST/33(信息技术安全技术)及其分委员会 IST/33/2(密码与安全机制)归口制定,ICS 分类号为 35.040。该系列为散列函数(Hash-functions)提供了标准化的定义与构造方法,规定了散列函数的一般要求、基于 n 位分组密码的构造、专用散列函数以及基于模运算的散列函数,是数据完整性校验、数字签名与消息认证等密码应用的基础标准。
💡 散列函数是密码学的”工作马”:它将任意长度的消息压缩为固定长度的摘要,并具备单向性与抗碰撞性。BS ISO/IEC 10118 通过对散列函数构造与安全属性的规范,使不同实现具有可验证的安全强度。
一、系列概述 📌
BS ISO/IEC 10118 系列由多个部分组成,本批材料收录了第 1、2、3、4 部分。第 1 部分为总则,给出散列函数的一般要求、术语、符号与编码约定;第 2 部分规定基于 n 位分组密码的散列函数构造;第 3 部分规定专用散列函数(Dedicated hash-functions);第 4 部分规定基于模运算的散列函数。该系列取代了早期版本,并纳入了多次修订与勘误,其中第 3 部分纳入了 2006 年修订 1。
标准主要服务于:密码算法与协议设计者、PKI 与证书系统实现人员、智能卡与安全芯片厂商、代码签名与软件供应链安全实施者,以及密码学安全评估与合规审计机构。
二、系列构成与技术要点 📋
| 标准号 | 中文标题 | 核心内容 |
| BS ISO/IEC 10118-1:2016 | 总则(General) | 散列函数的一般要求、术语、符号与编码约定,为其余各部分提供公共框架 |
| BS ISO/IEC 10118-2:2010 | 基于 n 位分组密码的散列函数 | 使用 n 位分组密码构造散列函数的方法,含填充方法(Padding)1 与 2 的规定 |
| BS ISO/IEC 10118-3:2003 | 专用散列函数 | 针对专门设计的散列函数算法(如基于迭代结构的哈希),纳入修订 1(2006) |
| BS ISO/IEC 10118-4:1998+A1:2014 | 基于模运算的散列函数 | 使用模运算(如模 2m 运算)构造的散列函数,纳入 A1:2014 修订(扫描版本,依据公开领域知识撰写) |
⚠️ 本材料中 BS ISO/IEC 10118-4 部分为扫描版本,相关描述依据该标准公开领域知识撰写,具体条款请以 BSI 官方发布版本为准。
三、关键技术要求 🔧
BS ISO/IEC 10118 系列的关键技术要求围绕散列函数的构造与安全属性:
- 单向性(One-way):给定散列值,难以反向恢复出对应的输入消息。
- 抗碰撞性(Collision resistance):难以找到两个不同的消息产生相同的散列值,这是数字签名安全的关键。
- 填充方法(第 2 部分):规定了两种填充方法(Padding 1 与 Padding 2),确保消息长度任意且输入被正确编码,避免长度扩展攻击。
- 迭代结构(第 3 部分):专用散列函数通常基于 Merkle-Damgård 或海绵等迭代结构,将固定长度压缩函数扩展为任意长度输入。
- 模运算构造(第 4 部分):基于模 2m 等模运算的散列函数,利用数论难解问题提供安全基础。
- 安全强度与输出长度:散列函数的输出长度决定其抗碰撞安全强度,标准规定了不同构造的推荐参数范围。
🚨 散列函数的安全强度随密码分析进展而衰减。已被证明存在弱点或输出长度不足的散列算法(如早期的 MD5、SHA-1 用于安全场景)应避免使用,应优先采用标准认可的现代算法并保证足够的输出长度。
四、工程实践应用 🛠️
在工程实践中,BS ISO/IEC 10118 系列主要应用于以下场景:
- 🔍 数字签名与证书:散列函数先对消息摘要,再对摘要签名,是 PKI 证书与数字签名的核心步骤。
- 🔧 数据完整性校验:在文件传输、软件下载与存储中,通过比对散列值验证数据是否被篡改或损坏。
- 📊 代码签名与供应链安全:软件发布者对安装包计算散列并签名,确保分发链路上的代码可信。
- 📋 口令存储与密钥派生:将口令经散列(必要时加盐)后存储,防止数据库泄露导致口令明文暴露;也可用于密钥派生。
✅ 建议密码系统设计者依据 BS ISO/IEC 10118 系列选择经认可的散列函数,并结合 ISO/IEC 9797(消息鉴别码)与 ISO/IEC 14888(数字签名)构建完整的安全方案,定期评估所选算法的安全余量。
五、常见问题解答 ❓
❓ 问:散列函数与消息鉴别码(MAC)有什么区别?
答:散列函数是公开的、无密钥的,用于检测数据完整性,但不提供认证(任何人都能计算);消息鉴别码(MAC)使用密钥参与计算,既能检测完整性又能认证发送者身份。两者常结合使用。
❓ 问:为什么抗碰撞性如此重要?
答:数字签名通常对消息的散列值签名,若攻击者能构造两个不同消息产生相同散列值,就能诱使受害者对恶意消息的签名进行验证,从而伪造签名。抗碰撞性正是防止此类”哈希碰撞”攻击。
❓ 问:填充方法(Padding)为何会影响安全性?
答:填充方法保证输入消息被正确编码且长度明确,避免不同消息被映射到相同的内部状态。若填充不当,可能引发长度扩展攻击,使攻击者在不知道密钥的情况下扩展已签名的消息。
❓ 问:第 2 部分”基于分组密码的散列函数”与第 3 部分”专用散列函数”有何不同?
答:第 2 部分利用现有分组密码(如 AES、TDEA)构造散列函数,可复用已有加密硬件;第 3 部分指专门为散列目的设计的算法(如 SHA 系列),通常性能更高、结构更精简。选择取决于可用硬件与安全需求。
❓ 问:散列函数的输出长度如何影响安全强度?
答:抗碰撞安全强度约为输出长度的一半(生日攻击),抗原像安全强度约为输出长度。输出越短,安全余量越小,应确保所选散列函数的输出长度足以抵御当前计算能力下的攻击。