赞
踩
SHA-256是由美国国家安全局(NSA)开发的SHA-2密码哈希函数之一,用于数字签名和区块链。在计算机科学和信息安全领域,SHA-256 (安全哈希算法 256位) 是广受欢迎且常被使用的密码学散列函数。SHA-256 产生一个唯一、定长的256位 (32字节)散列值,不仅可以用于密码学中信息的安全存储,还常常作为数据完整性校验的工具。
SHA-256 通过一系列计算复杂的数学操作来创建信息的哈希。这些操作包括位运算、模数运算和逻辑函数。SHA-256 的工作过程分为以下主要步骤:
填充位:首先,信息长度会被扩充至位数为 512 的倍数,这样可以保证信息可以被512位的块进行处理。
创建信息摘要:对每一个512位的数据块,SHA-256 会进行64轮的运算,使用了一系列复杂的数学函数和常数。这些函数包括按位运算、异或、位移等。
取得最后的散列值:将计算得到的所有的中间散列值进行逐位的异或运算,输出最后的散列结果。
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的工作原理呢?那么试着用图形语言去理解它!
多明戈·马丁(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位的。
下面是位运算的详细解释:
右旋转:右旋转7位,右旋转18位和右移3位是对输入W8进行的操作,结果代表σ0的运算结果。右旋转的意思是将二进制序列向右移动指定的位数,并将移出的位数补到序列的左端。
右移:右移3位是将二进制序列直接向右移动3位,移出的位数丢弃,左端补0。
位异或:位异或操作是将两个位进行比较,如果两个位不同,则结果为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,我们还可以实现许多其他的密码学应用,比如数字签名和证书。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。