我的学习笔记(6)- ABAP SHA-256 哈希算法

本文来源于我的知识星球里一位朋友的提问。

这个知识点我以前也没了解过,借这个机会,自己也去找资料学习了一下。

我之前的学习笔记罗列如下。

本文讨论的主题是 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 算法将任意长度的输入数据处理为固定长度的散列值,具体过程包括以下几个阶段:

  1. 消息填充:首先,SHA-256 对输入数据进行填充。填充的目的是使得数据的长度满足特定要求,即填充后的消息长度对 512 取余为 448。这通常通过在消息的末尾加上一个 1,然后添加足够的 0 来实现。最后,附加一个 64 位的二进制数,表示原始消息的长度。

  2. 消息分块:填充后的消息被分成多个 512 位的块。对于每个块,SHA-256 将其进一步处理,生成中间散列值。

  3. 初始化哈希值:SHA-256 使用一组特定的初始哈希值,这组值是由 32 位的常量组成的 8 个 32 位字。它们是算法开始时的初始状态,用于生成最终的散列值。

  4. 消息处理:SHA-256 对每个 512 位的消息块执行 64 轮迭代计算。在每轮中,算法对当前的消息块、前一轮的计算结果和一组常量进行一系列复杂的逻辑运算。这些运算包括位移、与、或、异或等操作,以及非线性函数的应用。这一阶段的目的是将输入数据逐渐压缩为一个 256 位的散列值。

  5. 生成最终哈希值:经过所有块的处理后,SHA-256 将每轮的计算结果组合起来,生成最终的 256 位散列值。这一散列值通常以 64 个十六进制字符的形式表示。

让我们通过一个更具体的例子来理解 SHA-256 是如何工作的。

示例:生成 Hello, World! 的 SHA-256 哈希值

假设我们有一个字符串 "Hello, World!",我们希望计算它的 SHA-256 哈希值。

  1. 输入消息:输入消息是 "Hello, World!"

  2. 消息填充:SHA-256 首先在消息末尾添加一个 1,然后加上若干个 0,直到消息长度对 512 取余为 448。最后,添加一个 64 位的二进制数表示原始消息的长度。

  3. 消息分块:填充后的消息被分为一个 512 位的块。

  4. 初始化哈希值:SHA-256 使用一组预定义的初始哈希值,这组值在算法的标准中已经定义好。

  5. 消息处理:SHA-256 对该 512 位块执行 64 轮的迭代计算。每轮都会对当前的消息块、前一轮的哈希值和一个常量进行复杂的位运算,生成一个中间哈希值。

  6. 生成最终哈希值:经过所有计算后,SHA-256 生成一个 256 位的散列值。

对于字符串 "Hello, World!",SHA-256 生成的散列值是:
dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
``
这个 64 个十六进制字符表示的是一个 256 位的哈希值。

SHA-256 的应用

SHA-256 在许多领域得到了广泛的应用,特别是在安全性要求较高的场合。以下是几个主要的应用场景:

  1. 数字签名
    SHA-256 在数字签名算法(Digital Signature Algorithm, DSA)中扮演了关键角色。在数字签名过程中,文档或消息首先通过 SHA-256 生成一个散列值,然后使用私钥对这个散列值进行签名。接收方可以使用相应的公钥验证签名的真实性和消息的完整性。

  2. 数据完整性校验
    SHA-256 常用于校验数据的完整性。例如,在文件传输过程中,发送方可以计算文件的 SHA-256 哈希值,并将其与文件一起发送。接收方收到文件后,重新计算文件的哈希值,并与发送方的哈希值进行比较。如果二者一致,则说明文件在传输过程中没有被篡改。

  3. 密码存储
    在密码存储中,SHA-256 也发挥了重要作用。许多系统在存储用户密码时,不会直接保存明文密码,而是先通过 SHA-256 计算出密码的哈希值,然后存储这个哈希值。这样,即使数据库被泄露,攻击者也无法直接获得用户的明文密码。

  4. 区块链技术
    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}')
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容