2012-03-16 11 views
10

मेरे पास एक टोमकैट सर्वर है जो कुछ जावा कोड चला रहा है जो उपयोगकर्ता को एपीआई कुंजी का उपयोग करके प्रमाणित करने देता है। अनुरोध SHA256 के साथ बनाए गए एचएमएसी का उपयोग करता है। मेरे पास रूबी क्लाइंट है जिसका मैं अनुरोध करने के लिए उपयोग कर रहा हूं और चूंकि मैं एन्क्रिप्शन के लिए नया हूं, मुझे एक मिलान करने वाला एचएमएसी उत्पन्न करने में मुश्किल हो रही है। मैंने इसे यूआरएल सुरक्षित बनाने की कोशिश नहीं की है, और वह मेल खाता है। तो मैं वास्तव में सोच रहा हूं कि मैं रूबी क्लाइंट को यूआरएल सुरक्षित संस्करण से मिलान करने के लिए कैसे प्राप्त कर सकता हूं (क्योंकि मैं जावा कोड नहीं बदल सकता)। अंत में यह एक अतिरिक्त = चरित्र मिला है। किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद।रूबी कैसे प्राप्त करें SHA256 के लिए एचएमएसी उत्पन्न किया जो जावा से मेल करने के लिए यूआरएल सुरक्षित है?

रूबी के लिए मैं 1.9.3 का उपयोग कर रहा हूं और जावा के लिए मैं अपाचे से कॉमन्स-कोडेक-1.6.जर लाइब्रेरी के साथ 6u31 का उपयोग कर रहा हूं।

कोड

रूबी:

require "openssl" 
require "base64" 

json_str = "{'community':'LG7B734A', 'login_id':'user1', 'time':'1331928899'}" 
digest = OpenSSL::Digest::Digest.new("sha256") 
key = [ "4cc45e4258121c3fec84147673e1bd88e51b1c177aafcfa2da72bd4655c9f933" ] 
hmac = OpenSSL::HMAC.digest(digest, key.pack("H*"), json_str) 

encoded_url_safe = Base64.urlsafe_encode64(hmac) 
encoded = Base64.encode64(hmac) 

puts("Encoded (Url Safe): " + encoded_url_safe) 
puts("Encoded   : " + encoded) 

जावा:

import org.apache.commons.codec.binary.Base64; 
import org.apache.commons.codec.binary.Hex; 

import javax.crypto.spec.SecretKeySpec; 
import javax.crypto.Mac; 

public class ExampleHMAC 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String key = "4cc45e4258121c3fec84147673e1bd88e51b1c177aafcfa2da72bd4655c9f933"; 
     byte[] keyBytes = Hex.decodeHex(key.toCharArray()); 

     SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256"); 
     Mac mac = Mac.getInstance("HmacSHA256"); 
     mac.init(keySpec); 

     String jsonStr = "{'community':'LG7B734A', 'login_id':'user1', 'time':'1331928899'}"; 
     byte[] hmacBytes = mac.doFinal(jsonStr.getBytes()); 

     String encodedUrlSafe = Base64.encodeBase64URLSafeString(hmacBytes); 
     String encoded = Base64.encodeBase64String(hmacBytes); 

     System.out.println("Encoded (Url Safe): " + encodedUrlSafe); 
     System.out.println("Encoded   : " + encoded); 
    } 
} 

आउटपुट

रूबी:

Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM= 
Encoded   : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM= 

जावा:

Encoded (Url Safe): QgYLqGm1M4qozdEjGC_CnJ8CdBm2jQpsU85kSWFcjKM 
Encoded   : QgYLqGm1M4qozdEjGC/CnJ8CdBm2jQpsU85kSWFcjKM= 

उत्तर

6

रूबी अनुगामी '=' को दूर नहीं करता है - यह एक निरपेक्ष आवश्यकता नहीं है, जैसा कि आप RFC 4648 में पढ़ सकते हैं यह सिर्फ कहा गया है कि उन्हें हटाने के कुछ अनुप्रयोगों में वांछनीय हो सकता है । लेकिन इसके अलावा यह गारंटी है कि रूबी का यूआरएल-सुरक्षित एन्कोडिंग जावा के समान ही होगा।

encoded_url_safe_.gsub!(/=+$/, "") 
+0

है कि मैं वास्तव में क्या जरूरत:

तो तुम क्या करने के लिए केवल एक चीज है, तो आप उदाहरण के लिए एक regex इस्तेमाल कर सकते हैं अनुगामी '==' बंद पट्टी है। आरएफसी 4648 का संदर्भ बहुत उपयोगी और पूरी तरह से था। मुझे नहीं पता था कि पिछला '=' वैकल्पिक था। मैंने कहा कि रेगेक्स कोड और यह काम करता है। धन्यवाद। – mvalley

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