0


保障安全的散列算法 - SHA256

引言

SHA-256是由美国国家安全局(NSA)开发的SHA-2密码哈希函数之一,用于数字签名和区块链。在计算机科学和信息安全领域,SHA-256 (安全哈希算法 256位) 是广受欢迎且常被使用的密码学散列函数。SHA-256 产生一个唯一、定长的256位 (32字节)散列值,不仅可以用于密码学中信息的安全存储,还常常作为数据完整性校验的工具。

内部工作原理

SHA-256 通过一系列计算复杂的数学操作来创建信息的哈希。这些操作包括位运算、模数运算和逻辑函数。SHA-256 的工作过程分为以下主要步骤:

  1. 填充位:首先,信息长度会被扩充至位数为 512 的倍数,这样可以保证信息可以被512位的块进行处理。
  2. 创建信息摘要:对每一个512位的数据块,SHA-256 会进行64轮的运算,使用了一系列复杂的数学函数和常数。这些函数包括按位运算、异或、位移等。
  3. 取得最后的散列值:将计算得到的所有的中间散列值进行逐位的异或运算,输出最后的散列结果。

SHA-256 对于相同输入总是产生相同的输出,任何对输入的微小修改都会引发输出结果的巨大变化,这就是所谓的"雪崩效应"。

加密示例

我们使用Python写一段通过 SHA-256 散列函数,实现一条消息的代码:

import hashlib

message = "Hello, World!"
hash_object = hashlib.sha256(message.encode())
hex_dig = hash_object.hexdigest()

print(hex_dig)

在上述代码中,首先导入

hashlib

模块,然后定义要哈希的消息。接下来,我们创建一个 SHA-256 哈希对象,并提供我们想要散列的信息。最后,我们将信息转化为16进制表示,以便更方便地存储和显示。

为什么”SHA-256 对于相同输入总是产生相同的输出“?

SHA-256 算法的关键在于它的确定性。如果你输入同样的信息,你将总是得到相同的结果。这是因为 SHA-256 是一种算法,也就是一组明确的计算步骤,这组步骤决定了如何将输入转化为输出。

这就像是一个烹饪食谱,如果你每次都使用确切相同的原料和相同的步骤,无论你做多少次,你得到的食物都应该是一样的。

当你将消息输入 SHA-256 算法时,该算法会执行一系列明确的数学操作来生成散列值。SHA-256 对每一个512位的数据块,会进行64轮明确的运算。这些运算包括位运算、逻辑函数、模数运算等。因为这些都是确定性的操作,所以对于同样的输入,它们总会得到完全相同的结果。

这就使得 SHA-256 具有一致性,对于相同的输入,它总会输出相同的哈希值,无论这个输入被运行多少次。这是密码学散列函数的一项重要特性。

Sha256 算法解释

读到这里,你是否还是不理解Sha256的工作原理呢?那么试着用图形语言去理解它!

多明戈·马丁(Domingo Martin)创作了一个网站叫“ Sha256算法解释”,这个网站很好地用图形语言展示了使用SHA-256生成哈希值的计算过程,SHA-256在SHA-2中特别使用。

在顶部的输入字段中输入您喜欢的字符串。这一次,我输入了csdn.net的URL。然后,将输入的 URL 转换为二进制数据。消息块由 32 位 x 16 行 = 512 位表示。

单击右上角的红色播放按钮,进入一个计算步骤。首先,基于由输入字符串的二进制文件组成的消息块,生成 32 位 x 64 行 = 2048 位的消息调度。

这个区块是SHA-256算法中用到的σ小写函数的表现形式。σ小写函数有σ0和σ1两种。对于SHA-256算法中的每一轮操作,σ0函数用于在第15轮到第64轮的计算中,σ1函数用于第16轮到第64轮的计算。σ函数是SHA-256算法的主要组成部分,也是SHA-256算法的核心部分之一,主要用于对数据进行位运算。

这里W8、W21、W7、W16、W23分别表示输入的消息数据块的第8个、第21个、第7个、第16个、第23个字(块),这些字都是32位的。

下面是位运算的详细解释:

  1. 右旋转:右旋转7位,右旋转18位和右移3位是对输入W8进行的操作,结果代表σ0的运算结果。右旋转的意思是将二进制序列向右移动指定的位数,并将移出的位数补到序列的左端。
  2. 右移:右移3位是将二进制序列直接向右移动3位,移出的位数丢弃,左端补0。
  3. 位异或:位异或操作是将两个位进行比较,如果两个位不同,则结果为1,否则结果为0。在这里,σ0和σ1函数的大部分工作就在这里,σ0函数对右旋转7位、右旋转18位和右移3位的结果进行位异或运算。

同样的,右旋转17位、右旋转19位和右移10位是对输入W21进行的操作,结果代表σ1的运算结果。

接着,W7、σ0、W16、σ1、W23五个32位的二进制数进行相加(位相加操作遵循二进制加法原理,考虑进位问题),结果作为计算W(i + 16)的一部分。这样就完成了SHA-256的一轮运算中的一部分。

按顶部的顺序进行此计算,将生成消息调度。

当生成所有 32 位 x 64 行的消息调度时,它看起来像这样。

然后从消息调度中计算哈希。与消息调度结合的'工作变量'a到h是组成哈希的八个变量。这八个变量的初始值设置为固定的初始哈希值。在SHA-256中,用演变出来的2, 3, 5, 7, 11, 13, 17, 和 19这八个质数的平方根的二进制作为初始哈希值。

计算比较复杂,但哈希计算基本上使用了循环移位和异或,就像消息调度生成时一样。一个计算新的哈希变量a到h从消息调度和哈希变量的特定行并覆盖它们的机制。

计算从消息调度的顶部开始按顺序执行,最终的哈希变量转换为十六进制十六进制并排列,并以 256 位哈希汇总。SHA-256哈希是基于原始数据的二进制数据,通过重复复杂的计算而得到的,从哈希中恢复原始数据是极其困难的。

应用场景

SHA-256 在许多不同的领域都有广泛的应用,尤其在信息安全和数据完整性验证方面。例如:在芯片通信、电子资金转账、数字签名、密码存储、区块链技术和数据备份中的应用。

SHA-256 是许多加密协议和安全标准的基础,例如在TLS和SSL协议中用于握手过程,并被用于IPSec中保障网络连接的安全。

值得注意的是:SHA-256 是许多加密货币,特别是比特币的核心组成部分。比特币的工作机制就是SHA-256散列函数,因为其在保障数据不可篡改和验证方面的作用。

结论

理解和使用 SHA-256 对于网络安全和密码学非常关键。不仅如此,基于 SHA-256,我们还可以实现许多其他的密码学应用,比如数字签名和证书。

标签: 安全 python 算法

本文转载自: https://blog.csdn.net/RabbitTuzi/article/details/137148954
版权归原作者 Rabbit-Tuzi 所有, 如有侵权,请联系我们删除。

“保障安全的散列算法 - SHA256”的评论:

还没有评论