什么是数字签名
在信息安全和加密领域中,H256(通常指的是 SHA-256)是一个哈希算法,它将输入的数据映射到一个固定长度的输出(通常是 256 位或 32 字节)。这种哈希算法广泛应用于数据完整性验证、数字签名、以及密码学领域的其他操作。
但是,你提到的 "H256" 和签名相关的情境中,应该是指数字签名技术。这是一个结合哈希算法和非对称加密的方法,用于确保数据的完整性、认证来源以及防篡改。
数字签名是什么?
数字签名是一种用于验证信息的来源和完整性的方法,通常涉及两个主要的过程:
签名生成(Signing):使用私钥对消息进行签名。
签名验证(Verification):使用公钥验证签名的合法性。
数字签名的作用包括:
认证:确保消息或文件确实来自发送者。
完整性:确保消息在传输过程中没有被篡改。
不可否认性:发送者不能否认已经发送过该信息。
SHA-256 和签名的关系
在数字签名的过程中,通常会用到哈希算法,比如 SHA-256。具体流程如下:
消息摘要:首先,使用 SHA-256 或其他哈希算法(如 SHA-1、SHA-512)对原始消息进行哈希,生成一个固定长度的 哈希值(通常是 256 位)。这个哈希值是消息的“指纹”,即使原始消息发生微小改变,哈希值也会发生显著变化。
签名生成:然后,使用发送者的 私钥 对哈希值进行加密,生成数字签名。这个数字签名会附加在消息上,一起发送给接收者。
签名验证:
接收者首先使用相同的哈希算法(例如 SHA-256)对接收到的消息进行哈希计算。
接着,接收者使用发送者的 公钥 对数字签名进行解密,从中获取到消息的哈希值。
如果接收者计算出的哈希值与解密得到的哈希值相同,说明消息未被篡改,并且确实是由持有私钥的人签名的。
数字签名的流程
原始消息(例如:"Hello, this is a secret message!")。
使用 SHA-256 对消息进行哈希处理,得到一个固定长度的哈希值。
使用私钥 对哈希值进行加密,得到数字签名。
将签名附加到消息上,发送给接收者。
接收者使用 SHA-256 对收到的消息进行哈希计算。
接收者使用发送者的 公钥 解密签名,得到原始的哈希值。
如果解密后的哈希值与接收者计算的哈希值相同,则消息和签名有效。
root@tr-desktop:/www/wwwroot/troa/webAPI/public/jwt# cat -n signature.php
1 <?php
2 function createHS256Signature($data, $secretKey) {
3 // 将数据编码为 JSON
4 $jsonData = json_encode($data);
5
6 // 使用 HMAC-SHA256 算法和密钥生成签名
7 $signature = hash_hmac('sha256', $jsonData, $secretKey, true);
8
9 // 将签名编码为 base64url 格式
10 return rtrim(strtr(base64_encode($signature), '+/', '-_'), '=');
11 }
12
13 // 示例数据
14 $data = [
15 "user" => "exampleUser",
16 "role" => "admin",
17 "iat" => time()
18 ];
19
20 // 密钥(应该保密)
21 $secretKey = "your-secret-key";
22
23 // 生成签名
24 $receivedSignature = createHS256Signature($data, $secretKey);
25 echo "HS256 签名: " . $receivedSignature."\r\n";
26
27 function verifyHS256Signature($data, $receivedSignature, $secretKey) {
28 // 将数据编码为 JSON
29 $jsonData = json_encode($data);
30
31 // 使用 HMAC-SHA256 算法和密钥生成签名
32 $calculatedSignature = hash_hmac('sha256', $jsonData, $secretKey, true);
33
34 // 将计算的签名编码为 base64url 格式
35 $calculatedSignatureBase64 = rtrim(strtr(base64_encode($calculatedSignature), '+/', '-_'), '=');
36 // 比较计算的签名和接收到的签名
37 return hash_equals($calculatedSignatureBase64, $receivedSignature);
38 }
39
40 // 示例数据
41 $data = [
42 "user" => "exampleUser",
43 "role" => "admin",
44 "iat" => time()
45 ];
46
47 // 密钥(应该保密)
48 $secretKey = "your-secret-key";
49 // 假设接收到的签名
50 echo "HS256 签名: " . $receivedSignature."\r\n";
51
52 // 验证签名
53 if (verifyHS256Signature($data, $receivedSignature, $secretKey)) {
54 echo "\r\n签名验证通过!";
55 } else {
56 echo "\r\n签名验证失败!";
57 }
58 ?>