SHA-256(安全散列算法256位)



SHA 256 是 SHA 2 算法家族的一部分,其中 SHA 代表安全散列算法。它于 2001 年发布,是 NSA 和 NIST 共同努力的结果,旨在推出 SHA 1 家族的继任者,后者正逐渐失去抵御暴力破解攻击的能力。

名称中的 256 表示最终哈希摘要值,即无论明文/纯文本的大小如何,哈希值始终为 256 位。

SHA-256 的特性

SHA 算法具有几个重要特性,例如 -

  • 消息长度 - 明文应小于 264 位。大小必须在相同范围内,以保持摘要尽可能随机。
  • 摘要长度 - SHA 256 方法的哈希摘要应为 256 位,SHA-512 的摘要应为 512 位,依此类推。较高的摘要通常表示需要进行更多计算,但会影响速度和空间。
  • 不可逆 - 根据设计,所有哈希函数(如 SHA 256)都是不可逆的。如果您已经拥有摘要,则不应获得明文,并且如果您再次将摘要放入哈希函数中,则摘要也不应返回其原始值。

现在您已经很好地了解了 SHA 的技术要求,您可以继续下一部分,了解整个方法。

算法

您可以将整个过程分为五个不同的部分,如下所示 -

填充位

它向消息添加一些额外的位,以便长度正好比 512 的倍数少 64 位。此外,第一位必须为 1,其余位应为 0。

Padding Bits

填充长度

现在,我们可以向最终明文添加 64 位数据,使其成为 512 的倍数。要确定这 64 位字符,请对未填充的初始明文应用模数运算。

Padding Length

初始化缓冲区

如下设置将在回合中使用的八个缓冲区的默认设置 -

Initialising the Buffers

我们需要在数组中保留 64 个不同的密钥,范围从 K[0] 到 K[63]。

压缩函数

整个消息被分成许多 512 位的块。它将每个块运行 64 轮运算,其中每一轮的输出都用作下一块的输入。

由于所有这些迭代中 K[i] 的值都是预先初始化的,因此 W[i] 是另一个输入,根据当时执行的迭代次数,为每个块单独计算。

输出

每次迭代,块的最终输出都成为下一个块的输入。整个循环持续进行,直到我们到达最后一个 512 位块,此时输出被视为最终哈希摘要。顾名思义,此摘要的长度将为 256 位。

SHA-256 的实现

现在,我们将使用多种编程语言实现 SHA-256,以获得实践经验。

使用 Python 实现 SHA-256

我们将首先导入 hashlib 库,如果您尚未安装,请使用 pip 安装。之后,我们将创建一个要哈希的字符串。然后,我们将使用 UTF-8 编码将字符串编码为字节,因为 hashlib 使用字节。我们将使用 hashlib.sha256() 生成新的 SHA-256 哈希对象。然后,我们将使用 update() 方法使用字符串的字节更新哈希对象。最后,我们将借助 hexdigest() 方法获取哈希的十六进制表示形式并打印它。

import hashlib

# generate a string to hash
my_string = "Hello, Tutorialspoint!"

# chaneg the string to bytes 
my_bytes = my_string.encode('utf-8')

# generate a new SHA-256 hash object
hash_object = hashlib.sha256()

# Update the hash object
hash_object.update(my_bytes)

# get the hexadecimal representation
hash_hex = hash_object.hexdigest()

# print the SHA-256 hash
print("SHA-256 hash of", my_string, ":", hash_hex)

输出

SHA-256 hash of Hello, Tutorialspoint! : caba24f8a70cc24277bffcc27aa952723fbf369f315b9657eebf7c7e42b7a1f9

使用 Java 实现 SHA-256

在此使用 Java 实现 SHA-256 的示例中,我们将定义一个名为 SHA256Class 的类,以生成给定输入字符串的哈希值。它使用 java.security 包中的 MessageDigest 类和 BigInteger 类将字节数组转换为十六进制字符串。因此,使用 Java 实现 SHA-256 的完整代码如下 -

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA256Class {
   public static byte[] calculateSHA256(String input) throws NoSuchAlgorithmException {
      MessageDigest md = MessageDigest.getInstance("SHA-256");
      return md.digest(input.getBytes(StandardCharsets.UTF_8));
   }

   public static String bytesToHexString(byte[] hash) {
      BigInteger number = new BigInteger(1, hash);
      StringBuilder hexString = new StringBuilder(number.toString(16));
      while (hexString.length() < 64) {
         hexString.insert(0, '0');
      }
      return hexString.toString();
   }

   public static void main(String args[]) {
      try {

         String message1 = "Simple SHA-256 Example";
         System.out.println("\n" + message1 + " : " + bytesToHexString(calculateSHA256(message1)));

         String message2 = "Secure Hash Algorithm";
         System.out.println("\n" + message2 + " : " + bytesToHexString(calculateSHA256(message2)));

         String message3 = "Hello, Tutorialspoint!";
         System.out.println("\n" + message3 + " : " + bytesToHexString(calculateSHA256(message3)));
      } catch (NoSuchAlgorithmException e) {
         System.out.println("Exception thrown for incorrect algorithm: " + e);
      }
   }
}

输出

Simple SHA-256 Example : 0e3c2ff641548fd5b1dd2724262cc099d56459ebec2c1bb3c7f71513f65ccb39

Secure Hash Algorithm : 42cf1ce9880d7f211c3d30d3bd376d20b26aaf6a929471108025c8e99b751c89

Hello, Tutorialspoint! : caba24f8a70cc24277bffcc27aa952723fbf369f315b9657eebf7c7e42b7a1f9

SHA-256 的安全性如何?

SHA-256 是目前最强大的哈希算法之一。美国政府建议其机构使用 SHA-256 来保护某些敏感数据。虽然 SHA-256 操作的细节被保密,但我们确实知道它是使用 Merkle-Damgård 结构构建的,该结构源自单向压缩函数,而该函数本身又是使用特定块密码的 Davies-Meyer 结构开发的。

SHA-256 安全的原因有三个 -

  • 首先,仅使用哈希值来重新创建原始数据非常困难。需要进行 2256 次暴力破解尝试才能生成第一组数据。
  • 其次,两条消息具有相同哈希值的可能性非常小——这种情况称为冲突。有 2256 个可能的哈希值,这比已知宇宙中的原子数量还要多,因此两个哈希值相同的可能性极低。
  • 第三,当对原始数据进行少量更改时会发生雪崩效应,从而导致哈希值发生很大变化,以至于很难分辨出新哈希值是从类似的材料中获得的。

SHA-256 的应用

SHA-256 是 SSL 握手、数字签名验证、保护密码以及其他各种与安全相关的任务的行业标准哈希算法。

数字签名的验证

数字签名是一种电子签名,用于验证通信(例如电子邮件、信用卡交易或数字文档)的真实性和一致性。它是通过对文件进行哈希并使用公钥基础设施 (PKI) 进行加密生成的。

在整个过程中,SHA-256 哈希方法保护了数字签名的完整性。接收方的网络浏览器在其端验证哈希算法,并使用公钥解密消息。如果它们匹配,则数据是真实且未被更改的。

SSL 握手

SSL 握手是 Web 浏览会话的关键组成部分,它依赖于 SHA-256 的功能和兼容性。在任何数据传输开始之前,通过 SS/TLS 进行的通信始终以 SSL 握手开始,这是一种非对称加密,使浏览器能够验证 Web 服务器、接收公钥并建立安全连接。

密码安全

用户密码以哈希形式存储在网站上。如前所述,安全的密码哈希使用加密方法将它们缩减为简短的字母和/或数字字符串。当网站受到攻击时,网络罪犯无法访问哈希密码。

区块链交易的验证

在比特币最初创建时,SHA-256 哈希算法是第一个与加密货币一起使用的算法。区块链需要区块头才能以有序的方式链接或连接一个交易块到下一个交易块。SHA-256 哈希确保在不影响新区块头的情况下,不会更改任何较早的区块。

广告