C++ 通过CryptoPP计算Hash值

Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库。它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto++ 的目标是提供高性能和可靠的密码学工具,以满足软件开发中对安全性的需求。

该库包含了许多常见的密码学算法,如AES、DES、RSA、DSA、SHA等,使开发者能够轻松地在他们的应用程序中实现安全性和加密功能。Crypto++ 是以面向对象的方式设计的,因此它的使用通常涉及使用类和对象来表示不同的密码学概念和算法。

Crypto++ 提供了许多特性,包括多平台支持(Windows、Linux、macOS等)、容易使用的 API、高性能的实现、丰富的文档和社区支持。在使用 Crypto++ 之前,你需要确保正确地配置和链接 Crypto++ 库到你的项目中。

编译Crypto库

目前Crypto库的最新版本为8.90,读者可自行下载对应的库源代码,下载好以后使用Visual Studio工具打开源文件中的cryptest.sln文件。

  • 源码下载地址:https://www.cryptopp.com/release890.html

打开以后选中调试菜单中的属性页面,此时将运行库修改为多线程/MT模式,否则虽可以编译通过但这个库却无法被正常使用,此处是一个坑。

此时选中解决方案,并直接点击重新编译库,这个过程可能需要等待一段时间,更具设备的配置而不同读者可在最底部看到输出进度;

当编译成功以后,读者可以来到cryptopp890\Win32\Output\Release目录下,该目录下的则是编译成功后的lib库文件,可以将这3个文件全部保存在新建的lib文件夹内。

接着在cryptopp890文件夹下直接搜索所有的*.h头文件,并放入到新建的include文件夹内,此时我们就有了最新版本的开发工具包了。

使用该库也很容易,只需要包含Include与Lib库文件即可,如下图所示配置;

使用MD5算法

MD5(Message Digest Algorithm 5)是一种常见的哈希函数,用于产生128位的散列值(通常以32位的十六进制数表示)。MD5广泛用于检查数据完整性、数字签名、密码存储等领域。

以下是 MD5 算法的基本概述:

  1. 输入处理: MD5 接受任意长度的输入,但输出是固定长度的128位。输入被划分为512位的块,每个块包含16个32位的字。
  2. 填充: 如果输入的位数不是512的倍数,就需要填充数据,使其长度满足这个条件。填充是通过在消息的末尾添加一个’1’和零比特,然后添加一个表示原始消息长度的64位整数来完成的。
  3. 初始化: MD5 有四个32位的寄存器(A、B、C、D),初始化为特定的常数。这些寄存器将在处理每个消息块时进行更新。
  4. 处理块: 对于每个512位块,MD5 执行64个操作轮次。每个轮次都使用一个非线性函数,一个常量和一个消息块的子集。这些轮次通过循环结构连接起来。
  5. 输出: MD5 的输出是四个32位字的级联,通常以32位的十六进制数表示。这四个字的顺序是 A、B、C、D。

MD5 算法的设计目标是产生一个唯一的(或极其难以相同)散列值,以便在密码存储、数字签名和数据完整性检查等场景中使用。然而,由于MD5存在一些安全性问题,特别是其易受碰撞攻击的漏洞,现在不再被推荐用于安全性要求较高的场景。对于安全性要求较高的应用,推荐使用更强大和安全的哈希函数,如SHA-256或SHA-3。

如下这段代码中涉及到一些特殊的类,这里将分别介绍功能;

  • FileSource: 用于从文件中读取数据。

  • StringSource: 用于从字符串或二进制数据中读取数据。

  • HashFilter: 表示一个用于计算哈希的过滤器。它接受一个哈希函数作为参数,这里是 md5

  • md5: 用于计算输入数据的 MD5 哈希值。

  • HexEncoder: 用于将二进制数据编码为十六进制表示。

  • StringSink(dst 或 digest): 用于将数据写入字符串。在这里,它将最终的哈希值以十六进制字符串的形式写入到 dstdigest 中。

#include <Windows.h>
#include <iostream>#include <md5.h>
#include <files.h>
#include <hex.h>using namespace std;
using namespace CryptoPP;#pragma comment(lib,"cryptlib.lib")int main(int argc, char* argv[])
{// 定义MD5类MD5 md5;// 计算字符串MD5string src = "Hello World";string dst;StringSource(src, true, new HashFilter(md5, new HexEncoder(new StringSink(dst))));std::cout << "字符串hash = " << dst << std::endl;// 计算字节数组MD5string digest;BYTE pData[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };DWORD dwDataSize = sizeof(pData);StringSource(pData, dwDataSize, true, new HashFilter(md5, new HexEncoder(new StringSink(digest))));std::cout << "数组长度 = " << dwDataSize << std::endl;std::cout << "数组hash = " << digest << std::endl;system("pause");return 0;
}

运行后则可分别输出字符串与数组的MD5值,如下图所示;

如果需要从文件中读取则需要使用FileSource类,在计算MD5之前先将文件读入内存在进行计算,如下所示;

#include <Windows.h>
#include <iostream>#include <md5.h>
#include <files.h>
#include <hex.h>using namespace std;
using namespace CryptoPP;#pragma comment(lib,"cryptlib.lib")// 计算文件MD5
string CalMD5ByFile(char *pszFileName)
{string value;MD5 md5;FileSource(pszFileName, true, new HashFilter(md5, new HexEncoder(new StringSink(value))));return value;
}// 计算数据MD5
string CalMD5ByMemory(PBYTE pData, DWORD dwDataSize)
{string value;MD5 md5;StringSource(pData, dwDataSize, true, new HashFilter(md5, new HexEncoder(new StringSink(value))));return value;
}int main(int argc, char* argv[])
{// 定义MD5类MD5 md5;// 计算文件的MD5string md51 = CalMD5ByFile("d://lyshark.exe");printf("md5 = %s\n", md51.c_str());// 计算文件内存的MD5HANDLE hFile2 = CreateFile("d://lyshark.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);// 取文件长度DWORD dwFileSize2 = GetFileSize(hFile2, NULL);BYTE *pData2 = new BYTE[dwFileSize2];// 读文件到内存ReadFile(hFile2, pData2, dwFileSize2, NULL, NULL);// 计算MD5string md52 = CalMD5ByMemory(pData2, dwFileSize2);printf("md5 = %s\n", md52.c_str());system("pause");return 0;
}

如下图所示,是计算后得到的文件的MD5值;

使用CRC32算法

CRC32(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据校验的错误检测算法。它基于多项式除法,在计算机领域中常用于检测数据传输或存储过程中的错误。

以下是CRC32算法的基本概述:

  1. 多项式选择: CRC32使用一个32位的二进制多项式,通常表示为一个32位的二进制数。这个多项式在CRC计算中充当除数。
  2. 数据处理: 要计算CRC32,首先需要将数据按位划分成块,每个块的长度等于多项式的次数。通常,CRC32使用字节为单位进行处理。
  3. 初始值: CRC32计算开始前,需要初始化一个32位的寄存器为一个特定的初始值,通常为全1或全0。
  4. 除法运算: 对于每个数据块,将它与32位的寄存器中的值进行异或操作。然后,将寄存器中的值右移一位,再与多项式进行异或操作。这个过程重复进行,直到所有数据块都被处理完。
  5. 最终值: 在处理完所有数据块后,寄存器中的值就是CRC32的最终校验值。
  6. 校验值附加: 通常,CRC32的结果会附加在原始数据的末尾,形成一个带有校验值的完整数据块。

CRC32广泛应用于文件传输、存储系统、以太网通信等领域,用于检测数据传输中的错误。由于其简单性和高效性,CRC32在实际应用中被广泛采用。然而,需要注意的是,CRC32主要用于错误检测而非安全性,不适用于对恶意操作的防范。在一些对安全性要求较高的场景中,其他更强大的校验算法可能更为合适。

crc32算法的使用只需要包含<crc.h>头文件,并将程序内的MD5类改为CRC32即可,其他的无任何差异,代码如下所示;

#include <Windows.h>
#include <iostream>#include <crc.h>
#include <files.h>
#include <hex.h>using namespace std;
using namespace CryptoPP;#pragma comment(lib,"cryptlib.lib")// 计算文件CRC32
string CalCRCByFile(char *pszFileName)
{string value;CRC32 crc;FileSource(pszFileName, true, new HashFilter(crc, new HexEncoder(new StringSink(value))));return value;
}// 计算数据CRC32
string CalCRCByMemory(PBYTE pData, DWORD dwDataSize)
{string value;CRC32 crc;StringSource(pData, dwDataSize, true, new HashFilter(crc, new HexEncoder(new StringSink(value))));return value;
}int main(int argc, char* argv[])
{// 定义CRC32类CRC32 crc32;// 计算文件的MD5string crc = CalCRCByFile("d://lyshark.exe");printf("crc32 = %s\n", crc.c_str());// 计算文件内存的crcHANDLE hFile2 = CreateFile("d://lyshark.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);// 取文件长度DWORD dwFileSize2 = GetFileSize(hFile2, NULL);BYTE *pData2 = new BYTE[dwFileSize2];// 读文件到内存ReadFile(hFile2, pData2, dwFileSize2, NULL, NULL);// 计算crcstring crc2 = CalCRCByMemory(pData2, dwFileSize2);printf("crc32 = %s\n", crc2.c_str());system("pause");return 0;
}

程序运行后将会计算文件的CRC32值,如下图所示;

使用SHA1算法

SHA-1(Secure Hash Algorithm 1)是一种常见的哈希函数,用于生成160位的散列值。与MD5类似,SHA-1也被广泛用于数字签名、数据完整性验证等领域。然而,由于SHA-1存在一些安全性漏洞,特别是对碰撞攻击的脆弱性,因此在对安全性要求较高的应用中,不再推荐使用SHA-1,而是转向使用更安全的哈希算法,如SHA-256或SHA-3。

以下是SHA-1算法的基本概述:

  1. 输入处理: SHA-1同样接受任意长度的输入,但输出为160位。输入被划分为512位的块,每个块包含16个32位字。
  2. 填充: 与MD5类似,如果输入长度不是512的倍数,需要对输入进行填充,使其满足条件。填充的方式是在消息的末尾添加一个’1’和零比特,然后添加一个64位整数,表示原始消息长度。
  3. 初始化: SHA-1有五个32位的寄存器(A、B、C、D、E),初始化为特定的常数。这些寄存器将在处理每个消息块时进行更新。
  4. 处理块: SHA-1的处理方式类似于MD5,但使用了不同的非线性函数和常量。每个消息块经过80个操作轮次,其中包括迭代、位运算和条件操作。
  5. 输出: SHA-1的输出是五个32位字的级联,通常以40位的十六进制数表示。这五个字的顺序是A、B、C、D、E。

由于SHA-1存在安全性问题,特别是在2017年被证明对碰撞攻击不再是安全的,因此已经不再被推荐用于安全性要求较高的应用。取而代之的是,SHA-256和SHA-3等更安全的哈希算法,它们提供更长的输出长度和更强的抗碰撞能力。

与MD5的计算方法一致,SHA系列计算方式只需引入<sha.h>系列头文件,并使用SHA1 sha1;类进行计算即可,如下代码所示;

#include <Windows.h>
#include <iostream>#include <sha.h>
#include <files.h>
#include <hex.h>using namespace std;
using namespace CryptoPP;#pragma comment(lib,"cryptlib.lib")// 计算文件SHA1
string CalSHA1ByFile(char *pszFileName)
{string value;SHA1 sha1;FileSource(pszFileName, true, new HashFilter(sha1, new HexEncoder(new StringSink(value))));return value;
}// 计算数据SHA1
string CalSHA1ByMemory(PBYTE pData, DWORD dwDataSize)
{string value;SHA1 sha1;StringSource(pData, dwDataSize, true, new HashFilter(sha1, new HexEncoder(new StringSink(value))));return value;
}int main(int argc, char* argv[])
{// 定义SHA类SHA1 sha1;// 计算文件的sha1string sha11 = CalSHA1ByFile("d://lyshark.exe");printf("sha1 = %s\n", sha11.c_str());// 计算文件内存的sha1HANDLE hFile2 = CreateFile("d://lyshark.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);// 取文件长度DWORD dwFileSize2 = GetFileSize(hFile2, NULL);BYTE *pData2 = new BYTE[dwFileSize2];// 读文件到内存ReadFile(hFile2, pData2, dwFileSize2, NULL, NULL);// 计算sha1string sha12 = CalSHA1ByMemory(pData2, dwFileSize2);printf("sha1 = %s\n", sha12.c_str());system("pause");return 0;
}

sha1计算结果如下图所示;

使用SHA256算法

SHA-256(Secure Hash Algorithm 256-bit)是SHA-2(Secure Hash Algorithm 2)家族中的一种哈希函数,用于生成256位的散列值。SHA-256是目前广泛应用于各种安全领域的强大哈希算法,包括数字签名、证书签名、数据完整性验证等。SHA-256提供了更高的安全性,相对于之前的SHA-1和MD5来说更为强大。

以下是SHA-256算法的基本概述:

  1. 输入处理: SHA-256同样接受任意长度的输入,但输出为256位。输入被划分为512位的块,每个块包含16个32位字。
  2. 填充: 与SHA-1和MD5相似,如果输入长度不是512的倍数,需要对输入进行填充,以满足条件。填充的方式包括添加一个’1’和零比特,然后添加一个64位整数,表示原始消息长度。
  3. 初始化: SHA-256有八个32位的寄存器(A、B、C、D、E、F、G、H),初始化为特定的常数。这些寄存器将在处理每个消息块时进行更新。
  4. 处理块: SHA-256的处理方式包括64个操作轮次,每个轮次使用一个非线性函数、常量和消息块的子集。这些轮次通过循环结构连接起来。
  5. 输出: SHA-256的输出是八个32位字的级联,通常以64位的十六进制数表示。这八个字的顺序是A、B、C、D、E、F、G、H。

SHA-256相对于SHA-1和MD5提供了更高的抗碰撞能力和更强的安全性,使其成为当前广泛使用的哈希算法之一。然而,随着计算能力的增强,一些专家逐渐倾向于使用更长的哈希算法,如SHA-3,以适应未来更高的安全性需求。

代码调用上与sha1保持一致,Sha256同样只需要少量的更改,只要掌握了这个规律,那么则可以完成其他算法的调用,代码如下所示;

#include <Windows.h>
#include <iostream>#include <sha.h>
#include <files.h>
#include <hex.h>using namespace std;
using namespace CryptoPP;#pragma comment(lib,"cryptlib.lib")// 计算文件SHA1
string CalSHA1ByFile(char *pszFileName)
{string value;SHA256 sha256;FileSource(pszFileName, true, new HashFilter(sha256, new HexEncoder(new StringSink(value))));return value;
}// 计算数据SHA1
string CalSHA1ByMemory(PBYTE pData, DWORD dwDataSize)
{string value;SHA256 sha256;StringSource(pData, dwDataSize, true, new HashFilter(sha256, new HexEncoder(new StringSink(value))));return value;
}int main(int argc, char* argv[])
{// 定义SHA类SHA256 sha256;// 计算文件的sha256string sha11 = CalSHA1ByFile("d://lyshark.exe");printf("sha256 = %s\n", sha11.c_str());// 计算文件内存的sha256HANDLE hFile2 = CreateFile("d://lyshark.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);// 取文件长度DWORD dwFileSize2 = GetFileSize(hFile2, NULL);BYTE *pData2 = new BYTE[dwFileSize2];// 读文件到内存ReadFile(hFile2, pData2, dwFileSize2, NULL, NULL);// 计算sha256string sha12 = CalSHA1ByMemory(pData2, dwFileSize2);printf("sha256 = %s\n", sha12.c_str());system("pause");return 0;
}

运行后则可输出文件的sha256值,如下图所示;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3 测试驱动的Spring Boot应用程序开发数据层示例

文章目录 用户故事数据模型选择数据库SQL与NoSQLH2、Hibernate和JPA Spring Boot Data JPA依赖关系和自动配置Spring Data JPA技术栈数据源&#xff08;自动&#xff09;配置 实体存储库存储User和ChallengeAttempt显示最近的ChallengeAttempt服务层控制器层用户界面 小结 文章…

go学习之文件操作与命令行参数

文章目录 一、文件操作1.基本介绍2.常用文件操作函数和方法3.关于文件操作应用实例4.写文件操作应用实例&#xff08;创建文件并写入文件&#xff09;1&#xff09;基本介绍2&#xff09;基本应用实例-方式一 5.判断文件是否存在6.统计英文、数字、空格和其他字符数量 二、命令…

武汉凯迪正大KDZD5289硫化曲线测试仪(电脑无转子硫化仪)

电脑无转子硫化仪 硫化时间测试仪 硫化曲线仪 硫化曲线测试仪 武汉凯迪正大KDZD5289产品概述 KDZD5289硫化曲线测试仪&#xff08;电脑无转子硫化仪&#xff09;采用电脑控制进口温控仪进行准确控温&#xff0c;计算机适时进行数据处理并可进行统计、分析、存储对比等&#xff…

报错解决:You may need an additional loader to handle the result of these loaders.

报错信息如下 vue 项目 Module parse failed: Unexpected token (1:9) File was processed with these loaders:* ./node_modules/vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js* ./node_modules/babel-loader/lib/index.js* ./node_modules/eslint-loader/in…

golang channel执行原理与代码分析

使用的go版本为 go1.21.2 首先我们写一个简单的chan调度代码 package mainimport "fmt"func main() {ch : make(chan struct{})go func() {ch <- struct{}{}ch <- struct{}{}}()fmt.Println("xiaochuan", <-ch)data, ok : <-chfmt.Println(&…

c++——string字符串____迭代器.范围for.修改遍历容量操作

在成为大人的路上喘口气. 目录 &#x1f393;标准库类型string &#x1f393;定义和初始化string对象 &#x1f4bb;string类对象的常见构造 &#x1f4bb;string类对象的不常见构造 &#x1f4bb;读写string对象 &#x1f393; string类对象的修改操作 &#x1f4…

从0开始学习JavaScript--JavaScript 中 `let` 和 `const` 的区别及最佳实践

在JavaScript中&#xff0c;let 和 const 是两个用于声明变量的关键字。尽管它们看起来很相似&#xff0c;但它们之间有一些重要的区别。本篇博客将深入探讨 let 和 const 的用法、区别&#xff0c;并提供一些最佳实践&#xff0c;以确保在代码中正确使用它们。 let 和 const …

jenkins pipeline 运行超时后强制停止

在Jenkins中&#xff0c;Pipeline是一种用于定义持续集成/持续交付&#xff08;CI/CD&#xff09;流程的工具。有时候&#xff0c;Pipeline的执行可能会超时&#xff0c;需要强制停止。 要在Jenkins Pipeline中设置超时&#xff0c;并在超时后强制停止运行&#xff0c;可以使用…

2.2 - 网络协议 - IP协议,IP地址划分,报文格式,数据分片,抓包实战

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 IP协议 1、IP地址划分2、IP协议报文格式3、IP协议数…

深度学习框架:Pytorch与Keras的区别与使用方法

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 Pytorch与Keras介绍 Pytorch 模型定义 模型编译 模型训练 输入格式 完整代码 Keras 模型定义 模型编译 模型训练 输入格式 完整代…

渗透测试考核(靶机1)

信息收集 主机发现 nbtscan -r 172.16.17.0/24 发现在局域网内&#xff0c;有两台主机名字比较可疑&#xff0c;177和134&#xff0c;猜测其为目标主机&#xff0c;其余的应该是局域网内的其他用户&#xff0c;因为其主机名字比较显眼&#xff0c;有姓名的拼音和笔记本电脑的…

【Python】SqlmapAPI调用实现自动化SQL注入安全检测

文章目录 简单使用优化 应用案例&#xff1a;前期通过信息收集拿到大量的URL地址&#xff0c;这个时候可以配置sqlmapAP接口进行批量的SQL注入检测 &#xff08;SRC挖掘&#xff09; 查看sqlmapapi使用方法 python sqlmapapi.py -h启动sqlmapapi 的web服务&#xff1a; 任务流…

【论文笔记】SDCL: Self-Distillation Contrastive Learning for Chinese Spell Checking

文章目录 论文信息Abstract1. Introduction2. Methodology2.1 The Main Model2.2 Contrastive Loss2.3 Implementation Details(Hyperparameters) 3. Experiments代码实现个人总结值得借鉴的地方 论文信息 论文地址&#xff1a;https://arxiv.org/pdf/2210.17168.pdf Abstrac…

idea doc 注释 插件及使用

开启rendered view https://blog.csdn.net/Leiyi_Ann/article/details/124145492 生成doc https://blog.csdn.net/qq_42581682/article/details/105018239 把注释加到类名旁边插件 https://blog.csdn.net/qq_30231473/article/details/128825306

聚类分析例题 (多元统计分析期末复习)

例一 动态聚类&#xff0c;K-means法&#xff0c;随机选取凝聚点&#xff08;题目直接给出&#xff09; 已知5个样品的观测值为&#xff1a;1&#xff0c;4&#xff0c;5&#xff0c;7&#xff0c;11。试用K均值法分为两类(凝聚点分别取1&#xff0c;4与1&#xff0c;11) 解&…

找不到 sun.misc.BASE64Decoder ,sun.misc.BASE64Encoder 类

找不到 sun.misc.BASE64Decoder &#xff0c;sun.misc.BASE64Encoder 类 1. 现象 idea 引用报错 找不到对应的包 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;2. 原因 因为sun.misc.BASE64Decoder和sun.misc.BASE64Encoder是Java的内部API&#xff0c;通…

VR虚拟教育展厅,为教学领域开启创新之路

线上虚拟展厅是一项全新的展示技术&#xff0c;可以为参展者带来不一样的观展体验。传统的实体展览存在着空间限制、时间限制以及高昂的成本&#xff0c;因此对于教育领域来说&#xff0c;线上虚拟教育展厅的出现&#xff0c;可以对传统教育方式带来改革&#xff0c;凭借强大的…

ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET

有个11g rac环境&#xff0c;停电维护后&#xff0c;orcl1正常启动了&#xff0c;orcl2启动报错如下 SQL*Plus: Release 11.2.0.4.0 Production on Wed Nov 29 14:04:21 2023 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SYS…

从0开始学习JavaScript--JavaScript 模板字符串的全面应用

JavaScript 模板字符串是 ES6 引入的一项强大特性&#xff0c;它提供了一种更优雅、更灵活的字符串拼接方式。在本文中&#xff0c;将深入探讨模板字符串的基本语法、高级用法以及在实际项目中的广泛应用&#xff0c;通过丰富的示例代码带你领略模板字符串的魅力。 模板字符串…

亚马逊云科技基于 Polygon 推出首款 Amazon Managed Blockchain Access,助 Web3 开发人员降低区块链节点运行成本

2023 年 11 月 26 日&#xff0c;亚马逊 (Amazon) 旗下 Amazon Web Services&#xff08;Amazon&#xff09;在其官方博客上宣布&#xff0c;Amazon Managed Blockchain (AMB) Access 已支持 Polygon Proof-of-Stake(POS) 网络&#xff0c;并将满足各种场景的需求&#xff0c;包…