2014-06-27 6 views
5

से भिन्न है यदि मैं "जाओ" भाषा में SHA-256 हैश उत्पन्न करता हूं, तो मुझे जावा समकक्ष की तुलना में एक अलग बाइट-ऐरे मिलता है।जाओ SHA-256 हैश जावा SHA-256 हैश

41 79 186 235 199 123 95 226 16 59 51 161 112 245 192 50 21 66 180 250 179 109 153 18 233 148 16 237 156 69 163 150] 

यह एक जावा कोड में भी ऐसा ही करना चाहिए::

MessageDigest md = MessageDigest.getInstance("SHA-256"); 

md.update("5nonce=5".getBytes()); 
byte[] digest = md.digest(); 

लेकिन में परिणाम

fmt.Println(getSha256([]byte("5nonce=5"))) 

जिसके परिणामस्वरूप सरणी की तरह दिखता है:

यह GO संस्करण है यह बाइट सरणी

[41, 79, -70, -21, -57, 123, 95, -30, 16, 59, 51, -95, 112, -11, -64, 50, 21, 66, -76, -6, -77, 109, -103, 18, -23, -108, 16, -19, -100, 69, -93, -106] 

वे अलग क्यों हैं? जावा संस्करण को वास्तव में गो संस्करण की तरह काम करने के लिए कैसे बदलूं?

उत्तर

17

वे अलग क्यों हैं?

वे वास्तव में नहीं हैं। वे एक ही बिट्स हैं। यह सिर्फ इतना है कि जावा में हस्ताक्षरित बाइट्स नहीं हैं - इसलिए शीर्ष बिट सेट वाला कोई बाइट नकारात्मक है। इस तरह के हर मामले में, आप देखेंगे कि जावा परिणाम = गो परिणाम - 256.

यदि आप दोनों बाइट सरणी हेक्स या बेस 64 में कनवर्ट करते हैं, तो आप एक ही परिणाम देखेंगे।

+0

धन्यवाद, उन्हें परिवर्तित base64 यह बनाता है उनकी तुलना करना बहुत आसान है और उन्हें समान माना जाता है। – jan

4

Here is the Go code जो एक ही परिणाम का उत्पादन होगा:

package main 

import "fmt" 
import "crypto/sha256" 

func main() { 
    sum224 := sha256.Sum256([]byte("5nonce=5")) 
    s := make([]int8, sha256.Size) 
    for i := range sum224 { 
     s[i] = int8(sum224[i]) 
    } 
    fmt.Printf("%d", s) 
} 

[41 79 -70 -21 -57 123 95 -30 16 59 51 -95 112 -11 -64 50 21 66 -76 -6 -77 109 -103 18 -23 -108 16 -19 -100 69 -93 -106] 

fmt doc करता है उल्लेख:

नहीं 'u' फ्लैग वहाँ है। इंटीग्रेट्स को हस्ताक्षरित मुद्रित किया जाता है यदि उनके पास हस्ताक्षर किए गए प्रकार हैं।

Numeric Types के बाद से परिभाषित करता है:

  • byte के लिए उर्फ ​​uint8
  • uint8 सभी अहस्ताक्षरित 8 बिट पूर्णांकों का सेट (255 करने के लिए 0)
  • int8 सब पर हस्ताक्षर किए 8 बिट के सेट पूर्णांक (-128 से 127)

यही कारण है कि आपको इसे देखने के लिए byte (हस्ताक्षरित) को हस्ताक्षरित int8 में परिवर्तित करने की आवश्यकता होगी।


आप बेस 64 एन्कोडिंग (golang playground देखें) जोड़ते हैं तो आप तुलना करने के लिए एक परिणाम के आसान प्राप्त कर सकते हैं:

import "encoding/base64" 

res := base64.StdEncoding.EncodeToString([]byte(sum224[:])) 
fmt.Println(res) 

देता है कि:

KU+668d7X+IQOzOhcPXAMhVCtPqzbZkS6ZQQ7ZxFo5Y= 
संबंधित मुद्दे