What problem does this solve? Are collisions common?
The beginning of Git supporting other hash algorithms
101–110 of 128 posts
Re: The beginning of Git supporting other hash algorithms
#102Bow that we have SHA-3, we ended up with a gazillion Keccak variants and Keccak-likes. The authors of Keccak have suggested that Git may instead want to consider e.g. SHAKE128. [0]
[0]: https://public-inbox.org/git/91a34c5b-7844-3db2-cf29-411df5b...
It's a bit unfortunate that this is really a cryptographic choice, and it seems to mostly be made by non-cryptographers. Furthermore, the people making that choice seem to be deeply unhappy about having to make it.
This makes me unhappy, because I wish making cryptographic choices got much easier over time, not harder. While SHA-2 was the most recent SHA, picking the correct hash function was easy: SHA-2. Sure, people built broken constructions (like prefix-MAC or whatever) with SHA-2, but that was just SHA-2 being abused, not SHA-2 being weak.
A lot of those footguns are removed with SHA-3, so I guess safe crypto choices are getting easier to make. On the other hand, the "obvious" choice, being made by aforementioned unhappy maintainers, is slow in a way that probably matters for some use cases. On the other hand, not even the designers think it's an obvious choice, I think most cryptographers don't think it's the best tool we have, and we have a design that we're less sure how to parametrize. There are easy and safe ways to parametrize SHA-3 to e.g. fix flaws like Fossil's artifact confusion -- but BLAKE2b's are faster and more obvious. And it's slow. Somehow, I can't be terribly pleased with that.
Re: The beginning of Git supporting other hash algorithms
#103Earlier quoted context omitted.
When you GPG sign a commit, you just GPG sign its hash, you're not signing its diff alongside it.
GPG signatures actually sign the hash digest of the text they're given. Fun fact, which I think (hope) changed in recent versions of GPG: the hash, by default, is (was?) SHA-1. One can check what is used with e.g. $ git cat-file -p $some_tag | gpg --list-packets | grep "digest algo" The output is of the form digest algo n, begin of digest xx yy Where n can be: 1: MD5 2: SHA1 8: SHA256 10: SHA512 (See RFC 4880, 9.4 fo…
I don't think it changes anything though, because of git's integrity. Stop me if I'm getting this wrong but, if you wanted to attack a signed git commit through the gpg signature's hash, you would have to modify the commit object itself... which yields a different commit hash in order to be valid. You'd have to get absurdly lucky to have a signature collision that contains a (valid) commit hash collision.
Re: The beginning of Git supporting other hash algorithms
#104Earlier quoted context omitted.
It shows that Linus is not a cryptographer, to be more precise. Though yes SHA-1 chosen prefix attacks are still very expensive at this point. I wonder how many non-cryptographers knew about SHA-2 back in 2003-2004.
Linus regularly treats security as a second-class citizen and is famous for his outrageous harassment [0]: > Of course, I'd also suggest that whoever was the genius who thought it was a good idea to read things ONE F CKING BYTE AT A TIME with system calls for each byte should be retroactively aborted. Who the f ck does idiotic things like that? How did they noty die as babies, considering that they were likely too st…
I agree that he should've used SHA-2 or better yet, have made the hash algorithm modular, but what does your quote add to the discussion?
Re: The beginning of Git supporting other hash algorithms
#105Earlier quoted context omitted.
GPG signatures actually sign the hash digest of the text they're given. Fun fact, which I think (hope) changed in recent versions of GPG: the hash, by default, is (was?) SHA-1. One can check what is used with e.g. $ git cat-file -p $some_tag | gpg --list-packets | grep "digest algo" The output is of the form digest algo n, begin of digest xx yy Where n can be: 1: MD5 2: SHA1 8: SHA256 10: SHA512 (See RFC 4880, 9.4 fo…
Interesting, I didn't know! Although it makes a lot of sense now that you bring it up. I don't think it changes anything though, because of git's integrity. Stop me if I'm getting this wrong but, if you wanted to attack a signed git commit through the gpg signature's hash, you would have to modify the commit object itself... which yields a different commit hash in order to be valid. You'd have to get absurdly lucky t…
object $sha1
type commit
tag $name
tagger $user $timestamp $tz
$text
If you wanted to attack a signed git commit through the gpg signature's hash, you would have to do a second preimage attack on that text with a different commit sha1.OTOH, if you wanted to attack a signed git commit through the git commit sha1, you would have to do a second preimage attack on that commit text, which is of the form:
commit $length\0
tree $sha1
parent $parent_sha1
author $author $author_timestamp $author_tz
committer $committer $committer_timestamp $committer_tz
$text
See where I'm going? it's the same kind of attack.Another way to attack it would be to do a second pre-image attack on the pointed tree, which is harder because there is not really free-form text available in a tree object.
Yet another way to attack it would be to do a second pre-image attack on one of the blobs pointed to by a tree, where the format is of the form:
blob $length\0$content
I don't think this is significantly easier than any of the second pre-image attacks mentioned above.So, in fact, in any case, to attack a gpg signed git tag, you need a second pre-image attack on the hash. If git uses something better than SHA-1, but GPG still uses SHA-1, the weakest link becomes, ironically, GPG.
That being said, second pre-image attacks are pretty much impractical for most hashes at the moment, even older ones that have been deemed broken for many years (like MD5 or even MD4 (TTBOMK)).
That is, even if git were using MD4, you couldn't replace an existing commit, tree or blob with something that has the same MD4.
Edit:
In fact, here's a challenge:
Let's assume that git can use any kind of hash instead of SHA1. Let's assume I have a repository with a single commit with a single tree that contains a single source file.
The source file is:
$ cat hackme.c
#include
int main() {
printf("Hack me, world!\n");
return 0;
}
So that we all talk about the same thing, here is the raw sha1 for this source: $ sha1sum hackme.c
cffc02c09faf2e9a83ecbb976e1304759868cf1c hackme.c
And its git SHA1: $ git hash-object hackme.c
36134c8c8e9fdf705441dcc1f71736064afc7c44
Here is how you can create this SHA1 without git: $ (echo -e -n blob $(stat -c %s hackme.c)\\x0; cat hackme.c) | sha1sum
36134c8c8e9fdf705441dcc1f71736064afc7c44 -
or $ (echo -e -n blob $(stat -c %s hackme.c)\\x0; cat hackme.c) | openssl sha1
(stdin)= 36134c8c8e9fdf705441dcc1f71736064afc7c44
And for git variants that would be using MD5: $ (echo -e -n blob $(stat -c %s hackme.c)\\x0; cat hackme.c) | openssl md5
(stdin)= 1b56dbc6613ff340b324ca973aec67f9
Or MD4: $ (echo -e -n blob $(stat -c %s hackme.c)\\x0; cat hackme.c) | openssl md4
(stdin)= 0eaabfc1a32629dce98c476f591c3f60
The challenge is this: attack the hypothetical repository using the hash of your choosing[1] ; replace that source with something that is valid C because people using the content of the repository will be compiling the source. Obviously, you'll need the hash to match for "blob $length\0$content" where $length is the length of $content, in bytes, and $content is your replacement C source code.1. let's say, pick any from the list on http://valerieaurora.org/hash.html
I posit you'll spend a lot of time and resources (and money) on the problem, (exponentially more so than Google did with SHAttered) except for Snefru.
Re: The beginning of Git supporting other hash algorithms
#106Re: The beginning of Git supporting other hash algorithms
#107Slightly similar: for a while I've wanted to recreate just enough of git's functionality to commit and push to GitHub. My guess is the commit part would be pretty trivial (as git's object and tree model is so simple) but the push/network/remote part a bunch harder.
Re: The beginning of Git supporting other hash algorithms
#108Earlier quoted context omitted.
Interesting, I didn't know! Although it makes a lot of sense now that you bring it up. I don't think it changes anything though, because of git's integrity. Stop me if I'm getting this wrong but, if you wanted to attack a signed git commit through the gpg signature's hash, you would have to modify the commit object itself... which yields a different commit hash in order to be valid. You'd have to get absurdly lucky t…
The text that GPG signs on a git tag is: object $sha1 type commit tag $name tagger $user $timestamp $tz $text If you wanted to attack a signed git commit through the gpg signature's hash, you would have to do a second preimage attack on that text with a different commit sha1. OTOH, if you wanted to attack a signed git commit through the git commit sha1, you would have to do a second preimage attack on that commit tex…
But for the commit it's different, because the $text in your example affects the hash of the commit itself. And my understanding is that if you sign the commit, you're signing both the contents and the hash of the content. Am I incorrect?
Re: The beginning of Git supporting other hash algorithms
#109Earlier quoted context omitted.
The text that GPG signs on a git tag is: object $sha1 type commit tag $name tagger $user $timestamp $tz $text If you wanted to attack a signed git commit through the gpg signature's hash, you would have to do a second preimage attack on that text with a different commit sha1. OTOH, if you wanted to attack a signed git commit through the git commit sha1, you would have to do a second preimage attack on that commit tex…
I was only talking about git commits though. For tags we agree, as the tag is only a pointer ( https://twitter.com/Adys/status/835595116110823425 ). But for the commit it's different, because the $text in your example affects the hash of the commit itself. And my understanding is that if you sign the commit, you're signing both the contents and the hash of the content. Am I incorrect?
Re: The beginning of Git supporting other hash algorithms
#110Earlier quoted context omitted.
This is a perfect example of a situation where hashing performance doesn't matter at all.
The hash function may not matter for overall git performance in virtually all dev machine setups, but there will be a (maybe tiny, maybe larger, depending on the repo and disk io speed) difference in cpu utilization and heat generation, right?