मैं एक बिगइंटर/बिग्नम हैश करने की कोशिश कर रहा हूं और मुझे एंड्रॉइड/आईओएस में अलग-अलग परिणाम मिल रहे हैं। मुझे एक ही हैश परिणाम प्राप्त करने की आवश्यकता है ताकि दोनों ऐप्स एसआरपी प्रोटोकॉल के अनुसार काम कर सकें। नज़दीकी निरीक्षण पर यह सकारात्मक संख्याओं के लिए ठीक काम कर रहा है लेकिन नकारात्मक संख्याओं के लिए काम नहीं कर रहा है (7 से अधिक पहले निबल)। सुनिश्चित नहीं है कि कौन सा सही है और दूसरे के साथ मिलान करने के लिए कौन सा समायोजित किया जाना है।SHA256 हैश परिणाम बड़ी संख्या के लिए एंड्रॉइड और आईओएस में भिन्न हैं
एंड्रॉयड:
void hashBigInteger(String s) {
try {
BigInteger a = new BigInteger(s, 16);
MessageDigest sha = MessageDigest.getInstance("SHA-256");
byte[] b = a.toByteArray();
sha.update(b, 0, b.length);
byte[] digest = sha.digest();
BigInteger d = new BigInteger(digest);
Log.d("HASH", "H = " + d.toString(16));
} catch (NoSuchAlgorithmException e) {
throw new UnsupportedOperationException(e);
}
}
iOS:
void hashBigNum(unsigned char *c) {
BIGNUM *n = BN_new();
BN_hex2bn(&n, c);
unsigned char buff[ SHA256_DIGEST_LENGTH ];
int len = BN_num_bytes(n);
unsigned char * bin = (unsigned char *) malloc(len);
BN_bn2bin(n, bin);
hash(SRP_SHA256, bin, len, buff);
fprintf(stderr, "H: ");
for (int z = 0; z < SHA256_DIGEST_LENGTH; z++)
fprintf(stderr, "%2x", buff[z]);
fprintf(stderr, "\n");
free(bin);
}
परिणाम:
Source String = "6F"
Android Hash = 65c74c15a686187bb6bbf9958f494fc6b80068034a659a9ad44991b08c58f2d2
iOS Hash = 65c74c15a686187bb6bbf9958f494fc6b80068034a659a9ad44991b08c58f2d2
Source String = "FF"
Android Hash = 06eb7d6a69ee19e5fbdf749018d3d2abfa04bcbd1365db312eb86dc7169389b8
iOS Hash = a8100ae6aa1940d0b663bb31cd466142ebbdbd5187131b92d93818987832eb89
साथ भी
BigInteger d = new BigInteger(digest);
बदलने के लिए, यह Android और iOS के बीच हैश मैच के लिए पर्याप्त नहीं है। हैश को यह जानने की जरूरत है कि स्पेक कहता है कि उन्हें क्या होना चाहिए। मैं किसी और के कार्यान्वयन का उपयोग करने का सुझाव देता हूं और देख रहा हूं कि उन्हें क्या हैश मिलते हैं। –@brianbeuning, हमने इस बिट को छोड़कर सभी प्रोटोकॉल को लागू किया है। एक बार जब मैंने अग्रणी 0s समस्या के लिए जावा कोड तय किया, तो यह ठीक क्रॉस प्लेटफार्म काम कर रहा है। – Harish
उदाहरण के लिए, ओपनएसएसएल एसआरपी का समर्थन करता है। यदि आप एसआरपी हैश की गणना करते हैं तो ओपनएसएसएल एसआरपी हैश की गणना करने के तरीके से मेल नहीं खाता है, आपका कोड OpenSSL से बात करने में सक्षम नहीं होगा। –