संदेश डाइजेस्ट (हैश) बाइट [] बाइट में [] बाहर है
एक संदेश डाइजेस्ट को एक फ़ंक्शन के रूप में परिभाषित किया गया है जो एक कच्ची बाइट सरणी लेता है और एक कच्ची बाइट सरणी (उर्फ byte[]
) देता है। उदाहरण के लिए SHA-1 (सिक्योर हैश अल्गोरिथम 1) का पाचन आकार 160 बिट या 20 बाइट है। कच्चे बाइट सरणियों की व्याख्या आमतौर पर UTF-8 जैसे चरित्र एन्कोडिंग के रूप में नहीं की जा सकती है , क्योंकि प्रत्येक क्रम में हर बाइट एक कानूनी नहीं है जो एन्कोडिंग है। इसलिए उन्हें एक साथ परिवर्तित करना :String
new String(md.digest(subject), StandardCharsets.UTF_8)
कुछ गैरकानूनी अनुक्रम बना सकते हैं या अपरिभाषित यूनिकोड मैपिंग के लिए कोड-पॉइंटर्स हो सकते हैं :
[�a�ɹ??�%l�3~��.
बाइनरी-टू-टेक्स्ट एन्कोडिंग
उसके लिए बाइनरी-टू-टेक्स्ट एन्कोडिंग का उपयोग किया जाता है। हैश के साथ, जो सबसे अधिक उपयोग किया जाता है वह एचईएक्स एन्कोडिंग या बेस 16 है । मूल रूप से एक बाइट से मान हो सकता है 0
करने के लिए 255
(या -128
करने के लिए 127
, जिनमें से हेक्स प्रतिनिधित्व के बराबर है पर हस्ताक्षर किए) 0x00
- 0xFF
। इसलिए हेक्स आउटपुट की आवश्यक लंबाई को दोगुना कर देगा, इसका मतलब है कि 20 बाइट आउटपुट 40 कैरेक्टर लंबा हेक्स स्ट्रिंग बनाएंगे, जैसे:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
ध्यान दें कि हेक्स एन्कोडिंग का उपयोग करना आवश्यक नहीं है। तुम भी base64 की तरह कुछ का उपयोग कर सकते हैं । हेक्स को अक्सर पसंद किया जाता है क्योंकि यह मनुष्यों द्वारा आसानी से पढ़ा जा सकता है और पैडिंग की आवश्यकता के बिना एक परिभाषित आउटपुट लंबाई है।
आप अकेले बाइट सरणी को JDK कार्यक्षमता के साथ हेक्स में बदल सकते हैं:
new BigInteger(1, token).toString(16)
ध्यान दें कि संख्या केBigInteger
रूप में बाइट सरणी की व्याख्या करेगा और बाइट स्ट्रिंग के रूप में नहीं। इसका मतलब है कि अग्रणी शून्य आउटपुट नहीं किया जाएगा और परिणामस्वरूप स्ट्रिंग 40 वर्णों से कम हो सकती है।
HEX को एनकोड करने के लिए पुस्तकालयों का उपयोग करना
अब आप स्टैक ओवरफ्लो से एक अप्रयुक्त बाइट-टू-हेक्स विधि को कॉपी या पेस्ट कर सकते हैं या अमरूद जैसे बड़े पैमाने पर निर्भरता का उपयोग कर सकते हैं ।
अधिकांश बाइट से संबंधित मुद्दों के लिए एक समाधान के लिए मैंने इन मामलों को संभालने के लिए एक उपयोगिता लागू की: बाइट्स-जावा (गिथब)
अपना संदेश डाइजेस्ट बाइट सरणी में बदलने के लिए आप बस कर सकते हैं
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
या आप केवल अंतर्निहित हैश सुविधा का उपयोग कर सकते हैं
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
हाइफ़न के बिना है, पता नहीं कि क्या इससे कोई फर्क पड़ेगा।