- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想计算一个大小超过1M的文件的SHA256值。为了使用 mbedtls 库获取此哈希值,我需要将整个文件复制到内存中。但是我的内存大小只有100K。所以我想知道有没有什么方法可以分段计算文件哈希值。
最佳答案
In order to get this hash value with mbedtls library, I need to copy the whole file to the memory.
这是不准确的。 mbedtls 库支持哈希值的增量计算。
要使用 mbedtls 计算 SHA-256 哈希值,您必须执行以下步骤 (reference):
mbedtls_sha256_context
结构的实例。mbedtls_sha256_init
初始化上下文,然后使用 mbedtls_sha256_starts_ret
。mbedtls_sha256_update_ret
将数据输入哈希函数。mbedtls_sha256_finish_ret
计算最终的哈希和。mbedtls_sha256_free
释放上下文请注意,这并不意味着 mbedtls_sha256_context
结构会保留整个数据,直到 mbedtls_sha256_finish_ret
被调用。相反,mbedtls_sha256_context
只保存散列计算的中间结果。当使用 mbedtls_sha256_update_ret
将额外数据输入哈希函数时,计算状态会更新,新的中间结果将存储在 mbedtls_sha256_context
中。
mbedtls_sha256_context
的总大小由 sizeof(mbedtls_sha256_context)
确定,在我的系统上为 108 字节。我们还可以从 mbedtls 源代码 ( reference ) 中看到这一点:
typedef struct mbedtls_sha256_context
{
uint32_t total[2]; /*!< The number of Bytes processed. */
uint32_t state[8]; /*!< The intermediate digest state. */
unsigned char buffer[64]; /*!< The data block being processed. */
int is224; /*!< Determines which function to use:
0: Use SHA-256, or 1: Use SHA-224. */
}
mbedtls_sha256_context;
我们可以看到该结构包含一个大小为 2*32 位 = 8 字节
的计数器,用于跟踪到目前为止已处理的字节总数。 8*32 bit = 32 byte
用于跟踪散列计算的中间结果。 64 byte
用于跟踪当前正在处理的数据 block 。如您所见,这是一个固定大小的缓冲区,不会随着散列数据量的增加而增长。最后使用一个 int 来区分 SHA-224 和 SHA-256。在我的系统上 sizeof(int) == 4
。所以总的来说,我们得到了 8+32+64+4 = 108 字节
。
考虑以下示例程序,它逐步将文件读取到大小为 4096 的缓冲区中,并在每一步中将缓冲区提供给哈希函数:
#include <mbedtls/sha256.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 4096
#define HASH_SIZE 32
int main(void) {
int ret;
// Initialize hash
mbedtls_sha256_context ctx;
mbedtls_sha256_init(&ctx);
mbedtls_sha256_starts_ret(&ctx, /*is224=*/0);
// Open file
FILE *fp = fopen("large_file", "r");
if (fp == NULL) {
ret = EXIT_FAILURE;
goto exit;
}
// Read file in chunks of size BUFFER_SIZE
uint8_t buffer[BUFFER_SIZE];
size_t read;
while ((read = fread(buffer, 1, BUFFER_SIZE, fp)) > 0) {
mbedtls_sha256_update_ret(&ctx, buffer, read);
}
// Calculate final hash sum
uint8_t hash[HASH_SIZE];
mbedtls_sha256_finish_ret(&ctx, hash);
// Simple debug printing. Use MBEDTLS_SSL_DEBUG_BUF in a real program.
for (size_t i = 0; i < HASH_SIZE; i++) {
printf("%02x", hash[i]);
}
printf("\n");
// Cleanup
fclose(fp);
ret = EXIT_SUCCESS;
exit:
mbedtls_sha256_free(&ctx);
return ret;
}
在大型示例文件上运行程序时,可以观察到以下行为:
$ dd if=/dev/random of=large_file bs=1024 count=1000000
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB, 977 MiB) copied, 5.78353 s, 177 MB/s
$ sha256sum large_file
ae2d3b46eec018e006533da47a80e933a741a8b1320cfce7392a5472faae0216 large_file
$ gcc -O3 -static test.c /usr/lib/libmbedcrypto.a
$ ./a.out
ae2d3b46eec018e006533da47a80e933a741a8b1320cfce7392a5472faae0216
我们可以看到程序计算出了正确的 SHA-256 哈希值。我们还可以检查程序使用的内存:
$ command time -v ./a.out
...
Maximum resident set size (kbytes): 824
...
我们可以看到该程序最多消耗了 824 KB 的内存。因此,我们计算了一个 1 GB 文件的哈希值,内存小于 1 MB。这表明我们不必立即将整个文件加载到内存中以使用 mbedtls 计算其哈希值。
请记住,此测量是在 64 位台式计算机而非嵌入式平台上完成的。此外,除了 -O3
和静态链接(后者大约将程序的内存使用量减半)之外,没有执行进一步的优化。我希望在具有更小地址大小和执行进一步优化的工具链的嵌入式设备上,内存占用空间会更小。
关于c - 使用 mbedlts 在内存受限的系统上使用 SHA 散列文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63051416/
安全服务 API 似乎不允许我直接计算哈希。有很多公共(public)领域和自由许可的版本可用,但如果可能的话,我宁愿使用系统库实现。 可以通过 NSData 或普通指针访问数据。 哈希的加密强度对我
我有一堆大对象,以及它们的结构和它们的向量。有时检查复合对象的完整性很重要;为此,我正在使用对象的 Sha256“签名”。 至少有两种方法可以定义复合对象的签名:通过计算组件串联的sha,或者通过计算
研究了一个 cpu 矿工的源代码,我发现了这段代码: work->data[20] = 0x80000000; 好吧,我问了编码,他的回答是: “这些值是标准 SHA-2 填充的一部分” 谷歌搜索“s
您是否需要许可证才能将 SHA-1 或 SHA-2 用于商业目的? 最佳答案 它最初由 NSA 为安全 DSA 加密创建,然后被 NIST 采用以维护算法的所有方面以及 SHA(2 和 3)。 这是一
谁能解释一下 SHA-256 和 RIPEMD-160,哪种算法通常更快,性能和空间比较是什么(如果有)?我所说的空间比较并不是指 160 位和 256 位,而是指冲突频率、生产环境中空间要求的差异。
我对 SHA-2 和 SHA-256 之间的区别有点困惑,并且经常听到它们互换使用。我认为 SHA-2 是哈希算法的“家族”,而 SHA-256 是该家族中的特定算法。任何人都可以消除困惑。 最佳答案
我正在尝试从 SHA-1 更改为 SHA-512 以获得更好的安全性,但我不完全清楚如何进行更改。 这是我使用 SHA-1 的方法: public static String sha1Convert(
在我的 C# 应用程序中,我使用 RSA 对文件进行签名,然后再由上传者上传到我公司的数据库中,在这里我必须选择 SHA-1 或 SHA-2 来计算哈希值。与编程中的任何其他组件一样,我知道必须有一个
我正在研究 SHA1 、 SHA-256 、 SHA-512 在不同处理器上的速度(计算哈希的时间) 这些散列算法可以分解为跨多个核心/线程运行吗? 最佳答案 如果您想将计算单个哈希的执行并行化(无论
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
这个问题在这里已经有了答案: SHA2 password hashing in java (4 个答案) 关闭 9 年前。 我需要计算文件的 SHA-2 或 SHA-3。我没有提交任何代码示例来说明
在我的应用中,之前开发者已经使用openssl version 1.0.1e [#include openssl/sha.h]并且已经使用了函数 unsigned char *SHA(const un
我正在尝试实现 SHA-2加密而不是 SHA-1 . 为此,我知道这两种哈希算法之间的位数不同,这让我很困惑。 如何实现这一目标以及我需要在哪些部分进行必要的更改? 我可以使用来自 Java、Pyth
我目前正在使用 SHA-1。我像下面的代码一样使用它,但我想将它更改为 SHA-256。 public String sha1Encrypt(String str) { if(str == nul
我想将一些 Java 代码转换为 C#。 Java 代码: private static final byte[] SALT = "NJui8*&N823bVvy03^4N".getBytes()
我的程序使用 SHA-1 证书进行 SSL 连接。 SHA-2 证书现在已被一些网络服务(Gmail)广泛使用。这会导致在电子邮件通知设置期间阻止与 SMTP 服务器的传入连接。 为了发送电子邮件,我
我在提交中生成差异/更改,以便我可以将其上传到 ReviewBoard。 我使用了“git show d9f7121e8ebd4d1f789dab9f8214ada2h480b9cf”。它给了我 di
我刚刚从这个 HN-post 了解到 git 正在转向新的散列算法(从 SHA-1 到 SHA-256 ) 我想知道是什么让 SHA-256 最适合 git 的用例。 是否有任何/许多强有力的技术原因
是的,我需要降级到 SHA-1 以增加对项目中旧浏览器的兼容性。 有没有办法做到这一点? 我正在使用 Linux Centos 6.5 和 Apache/2.2.15。 我有 3 个文件: SSLCe
在 TLS1.1 和 TLS1.2 中,Cipher(rsa-with-aes-128-cbc-sha) 将使用哪个 Digest(SHA1 或 SHA256)? 最佳答案 根据官方openssl w
我是一名优秀的程序员,十分优秀!