2015-06-05 18 views
5

मैंने एक वेबसाइट सेवा बनाई है जो एक सफल प्रमाणीकरण के बाद एक सुरक्षा टोकन देता है।क्यों SHA256 हैश "=" के साथ समाप्त होता है?

लेकिन जब डिबगिंग मैंने देखा कि हर हैश कि वेब सेवा जैसे "=" के साथ खत्म लौटे:

"tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc=" 
"INv7q72C1HvIixY1qmt5tNASFBEc0PnXRSb780Y5aeI=" 
"QkM8Kog8TtCczysDmKu6ZOjwwYlcR2biiUzxkb3uBio=" 
"6eNuCU6RBkwKMmVV6Mhm0Q0ehJ8Qo5SqcGm3LIl62uQ=" 
"dAPKN8aHl5tgKpmx9vNoYvXfAdF+76G4S+L+ep+TzU=" 
"O5qQNLEjmmgCIB0TOsNOPCHiquq8ALbHHLcWvWhMuI=" 
"N9ERYp+i7yhEblAjaKaS3qf9uvMja0odC7ERYllHCI=" 
"wsBTpxyNLVLbJEbMttFdSfOwv6W9rXba4GGodVVxgo=" 
"sr+nF83THUjYcjzRVQbnDFUQVTkuZOZYe3D3bmF1D8=" 
"9EosvgyYOG5a136S54HVmmebwiBJJ8a3qGVWD878j5k=" 
"8ORZmAXZ4dlWeaMOsyxAFphwKh9SeimwBzf8eYqTis=" 
"gVepn2Up5rjVplJUvDHtgIeaBL+X6TPzm2j9O2JTDFI=" 

क्यों इस तरह के एक व्यवहार?

+2

एसएचए कुंजी एक पूर्णांक है, यहां शायद यह एक [बेस 64] (https://en.wikipedia.org/wiki/Base64) कुंजी की एन्कोडिंग है। चूंकि कुंजी 256 बिट्स चौड़ी है, या 32 बाइट्स है, इसलिए इसे लगभग 4/3 * 32 ~ = 43 वर्णों के रूप में एन्कोड किया जाएगा। –

+0

वे केवल 44 वर्ण लंबे क्यों हैं? आप उन्हें किस आधार पर एन्कोड कर रहे हैं? – pzp

+0

@pzp उत्तर अभी ऊपर है। –

उत्तर

11

इसका कारण यह है कि आप हैश के कच्चे बाइट्स नहीं दिख रहा है बल्कि बेस 64 एन्कोडिंग।

बेस 64-एन्कोडिंग चार अक्षरों के ब्लॉक में 3 बाइट्स के ब्लॉक को परिवर्तित करता है। यह अच्छी तरह से काम करता है, तो बाइट की संख्या 3. से विभाज्य है यदि ऐसा नहीं है, तो आप द्वारा 4.

तो एक-पैडिंग चरित्र इतना जिसके परिणामस्वरूप वर्णों की संख्या अभी भी विभाज्य है का उपयोग करें:

(no of bytes)%3 = 0 => no padding needed 
(no of bytes)%3 = 1 => pad with == 
(no of bytes)%3 = 2 => pad with = 

एक SHA256-हैश 256 बिट है, जो 32 बाइट्स है। तो आपको पहले 30 बाइट्स के लिए 40 वर्ण मिलेगा, पिछले 2 बाइट्स के लिए 3 वर्ण होंगे और पैडिंग हमेशा एक = होगी।

+0

मैं निश्चित रूप से उत्तर से सहमत हूं, लेकिन मैं यह नहीं समझा सकता कि प्रश्न में तार सभी समान लंबाई क्यों नहीं हैं। शायद ओपी की गलती? –

4

इन स्ट्रिंग्स को base64, = वर्णों का उपयोग करके एन्कोड किया गया है, बेसबॉल स्ट्रिंग के अंतिम ब्लॉक को चार वर्णों के लिए पैडिंग के रूप में उपयोग किया जाता है।


निम्नलिखित रूबी कोड बेस 64 डीकोड स्ट्रिंग प्राप्त करने के लिए इस्तेमाल किया जा सकता:

require 'base64' 

s = "tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc=" 
puts Base64.decode64(s).bytes.map{|e| '%02x' % e}.join 

आउटपुट: b48347d09c66af2bc1ea94641228b588160fec545e743a8812cd0fa5bc3cde87

संबंधित मुद्दे