【问题标题】:SHA1 checksumming a length-prefixed message in a streaming fashionSHA1 以流方式校验和以长度为前缀的消息
【发布时间】:2019-04-12 00:20:26
【问题描述】:

Git-SHA 的计算方法是在消息前加上 "blob $DecimalMessageLength\0" 前缀,然后对前缀消息进行 SHA1 校验和。

从 SHA1 算法的属性来看,是否有可能以流方式执行此操作,即在消息体经过哈希处理后添加前缀?

下面的 C 示例(与安装了 libssl-dev 的 -lcrypto 的链接;它可能不是很有用,因为这个甚至没有公开 SHA1 算法,但我正在玩......):

#include <openssl/sha.h>
#include <stdio.h>
#include <stdlib.h>

int pr_dgst(unsigned char const Dgst[static SHA_DIGEST_LENGTH])
{
    char const digits[]="0123456789abcdef";
    char digest_pr[(SHA_DIGEST_LENGTH)*2+1];
    for(size_t i=0;i<SHA_DIGEST_LENGTH;i++){
        digest_pr[i*2+0]=digits[Dgst[i]/16];
        digest_pr[i*2+1]=digits[Dgst[i]%16];
    }
    digest_pr[(SHA_DIGEST_LENGTH)*2]='\0';
    return puts(digest_pr);
}

int main()
{
    system("echo gitsha; printf '%s' 'abc' | git hash-object --stdin");
    #define STR_STRLEN(A) A, (sizeof(A)/sizeof(*(A))-1) //paste string literal and its length

    unsigned char digest[SHA_DIGEST_LENGTH];
    SHA_CTX ctx;
    SHA1_Init(&ctx); SHA1_Update(&ctx,STR_STRLEN("blob 3\0abc")); SHA1_Final(digest,&ctx);
    pr_dgst(digest); //prints the same as the system command

    //do this in a streaming fashion??
    SHA1_Init(&ctx); 
    size_t len = 0;
    SHA1_Update(&ctx,STR_STRLEN("a")); len++;
    SHA1_Update(&ctx,STR_STRLEN("b")); len++;
    SHA1_Update(&ctx,STR_STRLEN("c")); len++;
    //"prepend" "blob 3\0" now?
    SHA1_Final(digest,&ctx);
    /*pr_dgst(digest);*/

}

【问题讨论】:

  • 如果答案是否定的,那么 git SHA 就像是一种相当迟钝的方式,可以任意弄乱 SHA1 算法的一个相当不错的属性,而没有任何实际好处。只是说。

标签: c algorithm sha1


【解决方案1】:

只能在消息流的末尾添加字节 - 否则哈希函数会被密码破解。

一个为 2 个文件添加一个 前缀 的好处是您可以存储 2 files with a known bare SHA-1 collision into the same repository and they would get different blob IDs!

【讨论】:

  • 你不也可以通过后缀 blob 部分来获得这个好处吗?
  • @PSkocik 否,因为如果碰撞文件的长度相同,则碰撞后的状态完全相同。
  • 我明白了。好吧,这让我对 git 哈希的感觉至少好一点(它们实际上更适合我的用例,因为我可以重用 git 已经计算过的一些内容,但 blob 前缀总是让我烦恼)。 :)
  • @PSkocik 在cryptopals 中存在一些关于 Merkle-Damgård 长度扩展攻击和哈希函数的其他属性的挑战 - 如果您不仅要针对位腐烂进行消息完整性检查,强烈建议您...
猜你喜欢
  • 2021-07-12
  • 2012-07-23
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多