2016-03-22 11 views
10

के साथ एक्सेस टोकन को मान्य करना मैं at_hash के विरुद्ध एक्सेस टोकन को सत्यापित करने का प्रयास कर रहा हूं। टोकन हैडर मैं अपने पहुँच टोकन से कैसे मिलता है Base64 को at_hash दावा मूल्य आईडी टोकन में है कि इनकोडिंग इसat_hash

{ "typ": "JWT", "alg": "RS256", "x5t": "MclQ7Vmu-1e5_rvdSfBShLe82eY", "kid": "MclQ7Vmu-1e5_rvdSfBShLe82eY" }

की तरह है? क्या कोई ऑनलाइन उपकरण है जो इससे मेरी मदद कर सकता है? क्या SHA256 हैश कैलक्यूलेटर इस के लिए सही उपकरण नहीं है?

धन्यवाद

+0

क्या उत्तर मैंने पोस्ट किया है, मेरा सी # वह तेज नहीं है :) – Harry

उत्तर

3

क्या SHA256 हैश कैलक्यूलेटर इस के लिए सही उपकरण नहीं है?

क्योंकि आप चरणों में से एक के लिए उपयोग बाइनरी डेटा होने की जरूरत है और लगभग सभी वेब उपकरण इनपुट के रूप में पाठ के कुछ प्रकार की उम्मीद है और उत्पादन के रूप में पाठ पैदा कर रहे हैं यह काम नहीं कर रहा। ऑनलाइन उपकरण इसके लिए उपयुक्त नहीं हैं। मैं एक उपकरण लिखूंगा ताकि आप देख सकें कि यह कैसे किया जाता है।

आईडी टोकन में एबीएचएड दावे मूल्य पर बेस 64 एन्कोड किए गए बेस 64 में मेरे एक्सेस टोकन से मैं कैसे प्राप्त करूं?

यह मेरा पहला सी # प्रोग्राम पुनरावृत्ति 2 है :) इसलिए यदि यह बदसूरत है क्योंकि मैंने इसे पहले कभी नहीं उपयोग किया है। इसके बाद स्पष्टीकरण बताएगा कि एट_शैश टोकन की गणना कैसे करें, जिसमें हमें decode_base64 क्यों चाहिए। इस कार्यक्रम का

using System; 
using System.Security.Cryptography; 

using System.Collections.Generic; 
using System.Text; 
namespace AtHash 
{ 
    class AtHash 
    { 
     private const String access_token = "ya29.eQGmYe6H3fP_d65AY0pOMCFikA0f4hzVZGmTPPyv7k_l6HzlEIpFXnXGZjcMhkyyuqSMtN_RTGJ-xg"; 
     private const String id1 = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImUxMWQ1N2QxZmY0ODA0YjMxYzA1MWI3MWY2ZDVlNWExZmQyOTdjZjgifQ"; 
     private const String id2 = "eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEwMTY5NDg0NDc0Mzg2Mjc2MzM0IiwiYXpwIjoiNDA3NDA4NzE4MTkyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJiaWxsZDE2MDBAZ21haWwuY29tIiwiYXRfaGFzaCI6ImxPdEkwQlJvdTBaNExQdFF1RThjQ3ciLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXVkIjoiNDA3NDA4NzE4MTkyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiaWF0IjoxNDMyMTQyMjIyLCJleHAiOjE0MzIxNDU4MjJ9"; 

     private byte[] decode_base64(String str) { 
      List<byte> l = new List<Byte>(Encoding.Default.GetBytes(str)); 
      while (l.Count % 4 != 0){ 
       l.Add(Convert.ToByte('=')); 
      } 
      return Convert.FromBase64String(Encoding.Default.GetString(l.ToArray())); 
     } 

     public String sha256_at_hash(String access_token) { 
      SHA256Managed hashstring = new SHA256Managed(); 
      byte[] bytes   = Encoding.Default.GetBytes(access_token); 
      byte[] hash = hashstring.ComputeHash(bytes); 
      Byte[] sixteen_bytes = new Byte[16]; 
      Array.Copy(hash, sixteen_bytes, 16); 
      return Convert.ToBase64String(sixteen_bytes).Trim('='); 
     } 

     public static void Main (string[] args) { 
      AtHash ah = new AtHash(); 
      byte[] id1_str = ah.decode_base64 (id1); 
      byte[] id2_str = ah.decode_base64 (id2); 

      Console.WriteLine(Encoding.Default.GetString(id1_str)); 
      Console.WriteLine(Encoding.Default.GetString(id2_str)); 

      Console.WriteLine ("\n\tat_hash value == " + ah.sha256_at_hash(access_token)); 
     } 
    } 
} 

आउटपुट (स्वरूपण मेरा)

{ 
    "alg":"RS256", 
    "kid":"e11d57d1ff4804b31c051b71f6d5e5a1fd297cf8" 
} 
{ 
    "exp" : 1432145822, 
    "iat" : 1432142222, 
    "azp" : "407408718192.apps.googleusercontent.com", 
    "aud" : "407408718192.apps.googleusercontent.com", 
    "email_verified" : true, 
    "iss" : "accounts.google.com", 
    "at_hash" : "lOtI0BRou0Z4LPtQuE8cCw", 
    "sub" : "110169484474386276334", 
    "email" : "[email protected]" 
} 

at_hash value == lOtI0BRou0Z4LPtQuE8cCw 

यह एक at_hash मूल्य सत्यापित करने का तरीका है। यदि आप मेरे द्वारा उपयोग किए गए डेटा का उपयोग करना चाहते हैं तो आप Google भाग को छोड़ सकते हैं, लेकिन यदि आप इसे नए डेटा पर जांचना चाहते हैं तो आप इसे Google पर प्राप्त कर सकते हैं ...

Googles O2Auth खेल का मैदान से पहुंच टोकन प्राप्त

https://developers.google.com/oauthplayground/ 

कुछ भी का चयन न करें यहां जाएं, पृष्ठ के नीचे स्थित वहाँ एक इनपुट बॉक्स है। openid में टाइप करें और Authorize APIs पर क्लिक करें, उस आईडी पर क्लिक करें जिसे आप उपयोग करना चाहते हैं और allow चुनें। Exchange authorization code for tokens का चयन करें। यदि सफल हो तो आपको निम्न जैसा कुछ मिल जाएगा।

{ 
"access_token": "ya29.eQGmYe6H3fP_d65AY0pOMCFikA0f4hzVZGmTPPyv7k_l6HzlEIpFXnXGZjcMhkyyuqSMtN_RTGJ-xg", 
"token_type": "Bearer", "expires_in": 3600, 
"refresh_token": "1/r5RRN6oRChjLtY5Y_T3lrqOy7n7QZJDQUVm8ZI1xGdoMEudVrK5jSpoR30zcRFq6", 
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImUxMWQ1N2QxZmY0ODA0YjMxYzA1MWI3MWY2ZDVlNWExZmQyOTdjZjgifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEwMTY5NDg0NDc0Mzg2Mjc2MzM0IiwiYXpwIjoiNDA3NDA4NzE4MTkyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJiaWxsZDE2MDBAZ21haWwuY29tIiwiYXRfaGFzaCI6ImxPdEkwQlJvdTBaNExQdFF1RThjQ3ciLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXVkIjoiNDA3NDA4NzE4MTkyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiaWF0IjoxNDMyMTQyMjIyLCJleHAiOjE0MzIxNDU4MjJ9.jtnP4Ffw2bPjfxRAEvHI8j88YBI4OJrw2BU7AQUCP2AUOKRC5pxwVn3vRomGTKiuMbnHqMyMiVSQZWTjAgjQrmaANxTEA68UMKh3dtu63hh4LHkGJly2hFcIKwbHxMWPDRO9nv8LxAUeCF5ccMgFNXhu-i-CeVtrMOsjCq6j5Qc" 
} 

id_token में तीन भागों अवधि . का उपयोग कर अलग कर दिया है। पहले दो भाग बेस 64 एन्कोडेड हैं। मैं id_token के तीसरे हिस्से को अनदेखा कर रहा हूं। हमें बेस 64 को डीकोड करने की जरूरत है। नोट, मैं बेस 64 स्ट्रिंग्स पैड को रोकने के लिए पर्ल का उपयोग कर रहा हूं यानी पर्ल इसे हमारे लिए संभालती है।

पहला भाग जो आप पहले ही जानते हैं हमें वह एल्गोरिदम देता है जिसे हमें उपयोग करने की आवश्यकता है।

perl -MMIME::Base64 -e 'print decode_base64("eyJhbGciOiJSUzI1NiIsImtpZCI6ImUxMWQ1N2QxZmY0ODA0YjMxYzA1MWI3MWY2ZDVlNWExZmQyOTdjZjgifQ")' 
{ 
"alg":"RS256", 
"kid":"e11d57d1ff4804b31c051b71f6d5e5a1fd297cf8" 
} 

दूसरा भाग at_hash मान देता है।

perl -MMIME::Base64 -e 'print decode_base64("eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEwMTY5NDg0NDc0Mzg2Mjc2MzM0IiwiYXpwIjoiNDA3NDA4NzE4MTkyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJiaWxsZDE2MDBAZ21haWwuY29tIiwiYXRfaGFzaCI6ImxPdEkwQlJvdTBaNExQdFF1RThjQ3ciLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXVkIjoiNDA3NDA4NzE4MTkyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiaWF0IjoxNDMyMTQyMjIyLCJleHAiOjE0MzIxNDU4MjJ9")' 

{ 
"iss":"accounts.google.com", 
........ 
"at_hash":"lOtI0BRou0Z4LPtQuE8cCw", 
........ 
"exp":1432145822 
} 

अब हम जानते हैं कि at_hash मूल्य हमें यह सत्यापित करना है कि वे एक ही कर रहे हैं ACCESS_TOKEN का उपयोग कर सकते है ... निम्नलिखित पर्ल कार्यक्रम करता है।

#!/usr/bin/env perl 
use strict; 
use warnings; 
use MIME::Base64; 
use Digest::SHA qw(sha256); 
my $data = "ya29.eQGmYe6H3fP_d65AY0pOMCFikA0f4hzVZGmTPPyv7k_l6HzlEIpFXnXGZjcMhkyyuqSMtN_RTGJ-xg"; 
my $digest = sha256($data); 
my $first_16_bytes = substr($digest,0,16); 
print encode_base64($first_16_bytes); 

इस कार्यक्रम के रूप में इस प्रकार है

perl sha256.pl 
lOtI0BRou0Z4LPtQuE8cCw== 

नोट हम at_hash मिला चलाया जा सकता है, लेकिन वे क्यों नहीं एक ही ..., वे वास्तव में एक ही यह सिर्फ उनमें से एक याद आ रही है है कर रहे हैं गद्दी। = संकेत तब तक जोड़े गए हैं जब तक कि निम्न सत्य नहीं है।

(strlen($base64_string) % 4 == 0) 

हमारे मामले

strlen("lOtI0BRou0Z4LPtQuE8cCw") == 22 

में तो हम दो == परिणाम :) करने के लिए जोड़ा गया। कारण यह है कि वे टोकन में नहीं हैं क्योंकि जिन लोगों ने भाषण लिखा है, वे नेटवर्क पर अनावश्यक बाइटों को पार करने पर विश्वास नहीं करते हैं, अगर वे दूसरे छोर पर जोड़े जा सकते हैं तो यह एक अच्छा विचार है।

2

यह कल्पना में बिल्कुल वर्णित:

https://openid.net/specs/openid-connect-core-1_0.html

3.1.3.6। आईडी टोकन

at_hash वैकल्पिक। टोकन हैश मान का उपयोग करें। इसका मान access_token मान के ASCII प्रतिनिधित्व के ऑक्टेट्स के बाएं-आधे भाग के हैश के बाएं-आधे हिस्से का बेस 64url एन्कोडिंग है, जहां हैश एल्गोरिदम का उपयोग हैश एल्गोरिदम है जो आईडी टोकन के जॉयस हेडर के हेडर पैरामीटर में उपयोग किया जाता है। उदाहरण के लिए, यदि एएलजी आरएस 256 है, तो SHA-256 के साथ access_token मान हैश, तो बाएं सबसे 128 बिट्स और base64url उन्हें एन्कोड करें। At_hash मान एक केस संवेदनशील स्ट्रिंग है।

+0

हाँ, मैंने कल्पना पढ़ी और फिर भी मैं इसे काम नहीं कर सका। मैं यहां पहुंच टोकन मान को हैशिंग करने का प्रयास करता हूं http://www.xorbin.com/tools/sha256-hash-calculator तो बेस 64 एन्कोडिंग यहां http://www.xorbin.com/tools/base64-encoder-and-decoder। अंतिम परिणाम – danijels

+1

होने के करीब भी नहीं है यहां एक जेएस-आधारित कार्यान्वयन है: https://github.com/IdentityModel/oidc-client-js/blob/dev/src/ResponseValidator.js#L248 –

2

मैं क्लाइंट रहस्य उत्पन्न करने में एक समान समस्या में भाग गया।

HashExtensions कक्षा को देखते हुए पहचान पहचान सर्वर उपयोगी था; मेरे मामले में मुझे यूटीएफ 8 एन्कोडिंग के साथ बाइट नहीं मिल रहा था। मुझे संदेह है कि आपके द्वारा लिंक किया गया ऑनलाइन टूल तारों को बाइट सरणी को एन्कोड करने के लिए एक अलग दृष्टिकोण ले रहा है।

+0

धन्यवाद, लेकिन मैं विभिन्न ऑनलाइन टूल्स भी कोशिश की। मैं समझना चाहता हूं कि एक अंतर क्यों है और निश्चित रूप से एक ऑनलाइन उपकरण ढूंढना आसान होना चाहिए जो एक ही काम करता है। – danijels