2014-01-25 4 views
-1
나는 다음과 같은 문자열을 SHA-1을 암호화하기 위해 노력하고

: 커밋 메시지와 함께 헤더와 함께,SHA-1 문자열 (자식 해시 객체 문자열)

commit 218\0tree 64a7513fad0b86d34b6feedbf9c2e99135819861 parent 233634213baf3f40236233f28c6646f20786a80a author CTF user <[email protected]> 1390678027 +0000 committer CTF user <[email protected]> 1390678027 +0000 Give me a Gitcoin 200 

그것은 자식 hash-object 입력이 . 내가 얻는 결과는 한 방법에서 다른 방법과 매우 다릅니다.

git hash-object를 사용하면 bed6b1001619ad84548d05db65a75ac80bf79f31이됩니다.

루비의 digest/sha1을 사용하면 이됩니다.

http://www.sha1-online.com을 사용하면 d543ddbfb7607464f5f964b9a3536eccedd1e1a4이됩니다.

이것은 매우 혼란 스럽습니다. 어떤 것이고 왜 git-hash-object의 기능을 모방 할 수 없습니까? http://git-scm.com/book/en/Git-Internals-Git-Objects을 읽고 그곳의 지침을 따르지 만 올바른 해시 다이제스트를 얻을 수없는 것 같습니다. 여기

내 루비 스 니펫된다

Digest::SHA1.hexdigest "commit #{body.length}\0#{body}"

해시 객체 헤더, 또는는 SHA-1을 해시하는 데 사용하는 문자열을 볼 수있는 자식의 방법이 있나요? 위의 내 방법에 어떤 문제가 있습니까?

+0

당신이 시도하고있는 무슨 문제가 완전히 명확하지 않다 해결하다. 이 질문에 대한 답변을보고 싶을 수도 있습니다 - http://stackoverflow.com/questions/552659/assigning-git-sha1s-without-git –

+0

@ D.Shawley git hash-object SHA- 1 값을 git-hash-object 대신 수동으로 사용하십시오. 나는 그 질문을 보았고 정확하게 그 일을하고있다. – darksky

+0

'tree 64a751 ... '로 시작하는 문자열을 어디서 얻었습니까? 실제 git commit과 비교할 때 커밋 데이터에 포함 된 개행 문자가 포함되어 있지만 한 줄에 모두 포함되지는 않습니다. – torek

답변

3

헬로 동료 스트라이프이 당신이 그것을 어떻게되는 플래그 참가자 :

을 캡처 (개행 문자가 있는지 확인하십시오!)

require 'digest/sha1' 

content = "tree #{tree} 
parent #{parent} 
author CTF user <[email protected]> #{timestamp} +0000 
committer CTF user <[email protected]> #{timestamp} +0000 

Give me a Gitcoin 

1 
" 

Digest::SHA1.hexdigest "commit #{content.length}\0#{content}" 
+0

새로운 라인이 문제였습니다 :) 나는 bash에서 같은 실수를하고있었습니다. 그것을 알아 냈다. 감사! – darksky