- 密码学教程
- 密码学 - 首页
- 密码学 - 起源
- 密码学 - 历史
- 密码学 - 原理
- 密码学 - 应用
- 密码学 - 优缺点
- 密码学 - 现代
- 密码学 - 传统密码
- 密码学 - 加密需求
- 密码学 - 双重强度加密
- 密码系统
- 密码系统
- 密码系统 - 组件
- 密码系统攻击
- 密码系统 - 彩虹表攻击
- 密码系统 - 字典攻击
- 密码系统 - 暴力破解攻击
- 密码系统 - 密码分析技术
- 密码学类型
- 密码系统 - 类型
- 公钥加密
- 现代对称密钥加密
- 密码学哈希函数
- 密钥管理
- 密码系统 - 密钥生成
- 密码系统 - 密钥存储
- 密码系统 - 密钥分发
- 密码系统 - 密钥撤销
- 分组密码
- 密码系统 - 流密码
- 密码学 - 分组密码
- 密码学 - Feistel分组密码
- 分组密码操作模式
- 分组密码操作模式
- 电子密码本 (ECB) 模式
- 密码分组链接 (CBC) 模式
- 密码反馈 (CFB) 模式
- 输出反馈 (OFB) 模式
- 计数器 (CTR) 模式
- 经典密码
- 密码学 - 逆向密码
- 密码学 - 凯撒密码
- 密码学 - ROT13 算法
- 密码学 - 换位密码
- 密码学 - 加密换位密码
- 密码学 - 解密换位密码
- 密码学 - 乘法密码
- 密码学 - 仿射密码
- 密码学 - 简单替换密码
- 密码学 - 简单替换密码加密
- 密码学 - 简单替换密码解密
- 密码学 - 维吉尼亚密码
- 密码学 - 实现维吉尼亚密码
- 现代密码
- Base64 编码和解码
- 密码学 - XOR 加密
- 替换技术
- 密码学 - 单表替换密码
- 密码学 - 破解单表替换密码
- 密码学 - 多表替换密码
- 密码学 - Playfair 密码
- 密码学 - 希尔密码
- 多表替换密码
- 密码学 - 一次性密码本密码
- 一次性密码本密码的实现
- 密码学 - 换位技术
- 密码学 - 栅栏密码
- 密码学 - 列置换
- 密码学 - 隐写术
- 对称算法
- 密码学 - 数据加密
- 密码学 - 加密算法
- 密码学 - 数据加密标准
- 密码学 - 三重DES
- 密码学 - 双重DES
- 高级加密标准
- 密码学 - AES 结构
- 密码学 - AES 变换函数
- 密码学 - 字节替换变换
- 密码学 - 行移位变换
- 密码学 - 列混合变换
- 密码学 - 轮密钥加变换
- 密码学 - AES 密钥扩展算法
- 密码学 - Blowfish 算法
- 密码学 - SHA 算法
- 密码学 - RC4 算法
- 密码学 - Camellia 加密算法
- 密码学 - ChaCha20 加密算法
- 密码学 - CAST5 加密算法
- 密码学 - SEED 加密算法
- 密码学 - SM4 加密算法
- IDEA - 国际数据加密算法
- 公钥(非对称)密码学算法
- 密码学 - RSA 算法
- 密码学 - RSA 加密
- 密码学 - RSA 解密
- 密码学 - 创建 RSA 密钥
- 密码学 - 破解 RSA 密码
- 密码学 - ECDSA 算法
- 密码学 - DSA 算法
- 密码学 - Diffie-Hellman 算法
- 密码学中的数据完整性
- 密码学中的数据完整性
- 消息认证
- 密码学数字签名
- 公钥基础设施
- 哈希
- MD5(消息摘要算法5)
- SHA-1(安全散列算法1)
- SHA-256(安全散列算法256位)
- SHA-512(安全散列算法512位)
- SHA-3(安全散列算法3)
- 哈希密码
- Bcrypt 哈希模块
- 现代密码学
- 量子密码学
- 后量子密码学
- 密码学协议
- 密码学 - SSL/TLS 协议
- 密码学 - SSH 协议
- 密码学 - IPsec 协议
- 密码学 - PGP 协议
- 图像和文件加密
- 密码学 - 图像
- 密码学 - 文件
- 隐写术 - 图像
- 文件加密和解密
- 密码学 - 文件加密
- 密码学 - 文件解密
- 物联网中的密码学
- 物联网安全挑战、威胁和攻击
- 物联网安全的加密技术
- 物联网设备的通信协议
- 常用加密技术
- 自定义构建加密算法(混合加密)
- 云加密
- 量子密码学
- 密码学中的图像隐写术
- DNA 密码学
- 密码学中的一次性密码 (OTP) 算法
- 区别
- 密码学 - MD5 与 SHA1
- 密码学 - RSA 与 DSA
- 密码学 - RSA 与 Diffie-Hellman
- 密码学与密码学
- 密码学 - 密码学与密码分析
- 密码学 - 经典与量子
- 密码学与隐写术
- 密码学与加密
- 密码学与网络安全
- 密码学 - 流密码与分组密码
- 密码学 - AES 与 DES 密码
- 密码学 - 对称与非对称
- 密码学有用资源
- 密码学 - 快速指南
- 密码学 - 讨论
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。
填充长度
现在,我们可以向最终明文添加 64 位数据,使其成为 512 的倍数。要确定这 64 位字符,请对未填充的初始明文应用模数运算。
初始化缓冲区
如下设置将在回合中使用的八个缓冲区的默认设置 -
我们需要在数组中保留 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 哈希确保在不影响新区块头的情况下,不会更改任何较早的区块。