本文来源于我的知识星球里一位朋友的提问。
这个知识点我以前也没了解过,借这个机会,自己也去找资料学习了一下。
我之前的学习笔记罗列如下。
本文讨论的主题是 ABAP 消息摘要这个工具类,cl_abap_message_digest.
从类的名称就能看出,这个类的职责是做消息摘要。
那么什么是消息摘要?
消息摘要,也称为哈希(Hash)函数,在计算机科学和密码学中扮演着重要的角色。消息摘要是一种将任意长度的数据(无论是文本、文件还是其他数据形式)映射为固定长度的字符串(通常为十六进制表示)的过程。这个固定长度的字符串称为摘要值
或哈希值
。
消息摘要的主要特点是,输入数据的任何微小变化都会导致生成的摘要值发生显著变化,同时不同的输入数据生成相同摘要值的概率非常低。消息摘要的广泛应用包括数据完整性校验、数字签名、加密算法、密码验证等领域。
消息摘要的主要功能之一,是提供一种有效的方式来验证数据的完整性。
当我们传输或存储数据时,经常需要确保数据未被篡改或损坏。通过生成原始数据的摘要值并在数据传输或存储后再次计算其摘要值,我们可以比较这两个摘要值,如果两者一致,则说明数据未发生变化。这种技术在网络通信、文件校验和密码存储中广泛应用。
举个实际例子,假设你正在通过互联网从一位朋友那里接收一个大文件。在传输之前,你的朋友计算了该文件的摘要值并将其发送给你。当文件传输完成后,你可以再次计算收到文件的摘要值,并将其与朋友发送的摘要值进行比较。如果两个摘要值一致,则表示文件在传输过程中没有被篡改或损坏。如果不一致,则表示文件可能在传输过程中发生了某种变化或损坏。
消息摘要算法有许多种,常见的包括 MD5、SHA-1、SHA-256 等。这些算法各有优缺点,尤其是在安全性和性能方面。早期的 MD5 和 SHA-1 算法由于其相对较短的摘要长度和设计上的漏洞,已经被证明不再安全,容易受到碰撞攻击。因此,在需要高安全性保障的场合,推荐使用 SHA-256 及其以上的算法。
什么是 SHA-256 算法
SHA-256 是一种密码学散列函数,属于安全哈希算法(Secure Hash Algorithm, SHA)家族。SHA-256 是由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布的。这一算法是 SHA-2(Secure Hash Algorithm 2)家族的一部分,SHA-2 家族包括多个不同长度的散列算法,如 SHA-224、SHA-256、SHA-384 和 SHA-512。SHA-256 是其中最为广泛使用的算法,它生成一个 256 位(32 字节)的固定长度散列值,无论输入数据的长度如何。
SHA-256 的工作原理
要理解 SHA-256 的工作原理,需要了解它背后的几个关键步骤。SHA-256 算法将任意长度的输入数据处理为固定长度的散列值,具体过程包括以下几个阶段:
消息填充:首先,SHA-256 对输入数据进行填充。填充的目的是使得数据的长度满足特定要求,即填充后的消息长度对 512 取余为 448。这通常通过在消息的末尾加上一个
1
,然后添加足够的0
来实现。最后,附加一个 64 位的二进制数,表示原始消息的长度。消息分块:填充后的消息被分成多个 512 位的块。对于每个块,SHA-256 将其进一步处理,生成中间散列值。
初始化哈希值:SHA-256 使用一组特定的初始哈希值,这组值是由 32 位的常量组成的 8 个 32 位字。它们是算法开始时的初始状态,用于生成最终的散列值。
消息处理:SHA-256 对每个 512 位的消息块执行 64 轮迭代计算。在每轮中,算法对当前的消息块、前一轮的计算结果和一组常量进行一系列复杂的逻辑运算。这些运算包括位移、与、或、异或等操作,以及非线性函数的应用。这一阶段的目的是将输入数据逐渐压缩为一个 256 位的散列值。
生成最终哈希值:经过所有块的处理后,SHA-256 将每轮的计算结果组合起来,生成最终的 256 位散列值。这一散列值通常以 64 个十六进制字符的形式表示。
让我们通过一个更具体的例子来理解 SHA-256 是如何工作的。
示例:生成 Hello, World!
的 SHA-256 哈希值
假设我们有一个字符串 "Hello, World!"
,我们希望计算它的 SHA-256 哈希值。
输入消息:输入消息是
"Hello, World!"
。消息填充:SHA-256 首先在消息末尾添加一个
1
,然后加上若干个0
,直到消息长度对 512 取余为 448。最后,添加一个 64 位的二进制数表示原始消息的长度。消息分块:填充后的消息被分为一个 512 位的块。
初始化哈希值:SHA-256 使用一组预定义的初始哈希值,这组值在算法的标准中已经定义好。
消息处理:SHA-256 对该 512 位块执行 64 轮的迭代计算。每轮都会对当前的消息块、前一轮的哈希值和一个常量进行复杂的位运算,生成一个中间哈希值。
生成最终哈希值:经过所有计算后,SHA-256 生成一个 256 位的散列值。
对于字符串 "Hello, World!"
,SHA-256 生成的散列值是:
dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
。
``
这个 64 个十六进制字符表示的是一个 256 位的哈希值。
SHA-256 的应用
SHA-256 在许多领域得到了广泛的应用,特别是在安全性要求较高的场合。以下是几个主要的应用场景:
数字签名
SHA-256 在数字签名算法(Digital Signature Algorithm, DSA)中扮演了关键角色。在数字签名过程中,文档或消息首先通过 SHA-256 生成一个散列值,然后使用私钥对这个散列值进行签名。接收方可以使用相应的公钥验证签名的真实性和消息的完整性。数据完整性校验
SHA-256 常用于校验数据的完整性。例如,在文件传输过程中,发送方可以计算文件的 SHA-256 哈希值,并将其与文件一起发送。接收方收到文件后,重新计算文件的哈希值,并与发送方的哈希值进行比较。如果二者一致,则说明文件在传输过程中没有被篡改。密码存储
在密码存储中,SHA-256 也发挥了重要作用。许多系统在存储用户密码时,不会直接保存明文密码,而是先通过 SHA-256 计算出密码的哈希值,然后存储这个哈希值。这样,即使数据库被泄露,攻击者也无法直接获得用户的明文密码。区块链技术
SHA-256 在区块链技术中占据核心地位。比特币区块链中,SHA-256 用于生成区块的哈希值,这个哈希值不仅可以唯一标识一个区块,还与区块链的安全性和共识机制密切相关。
SHA-256 的安全性
SHA-256 被认为是目前非常安全的哈希算法之一。其设计使得找到两个不同输入却生成相同哈希值的概率极低,这被称为碰撞攻击。尽管 SHA-256 的安全性在现阶段是有保障的,但随着计算能力的不断提升,特别是量子计算的发展,SHA-256 的安全性可能在未来面临挑战。
量子计算机理论上能够通过 Grover 算法以平方根的复杂度破解哈希函数。尽管如此,即便在量子计算环境下,SHA-256 仍然比许多其他哈希函数更为安全。因此,研究人员正在探索基于量子抗性的新哈希算法,以应对潜在的量子计算威胁。
对于应用开发人员来说,不需要手动实现 SHA-256 这些消息摘要算法,直接使用编程语言自带的库或者工具函数即可。
计算字符串 Hello, World!
的 SHA-256 哈希值,ABAP 代码如下:
CALL METHOD cl_abap_message_digest=>calculate_hash_for_char
EXPORTING
if_algorithm = 'SHA256'
if_data = 'Hello, World!'
IMPORTING
ef_hashstring = DATA(lv_hash).
Node.js 版本:
const crypto = require('crypto');
// 要计算哈希值的字符串
const message = 'Hello, World!';
// 计算 SHA-256 哈希值
const hash = crypto.createHash('sha256').update(message).digest('hex');
// 输出结果
console.log(`SHA-256 Hash: ${hash}`);
Python 版本:
import hashlib
# 要计算哈希值的字符串
message = 'Hello, World!'
# 计算 SHA-256 哈希值
hash_object = hashlib.sha256(message.encode())
hash_hex = hash_object.hexdigest()
# 输出结果
print(f'SHA-256 Hash: {hash_hex}')