2012-04-23 13 views
5

मैं एक यूआरएल स्ट्रिंग के कुछ हिस्सों को खराब करने के लिए एक सरल स्ट्रिंग एन्कोडर को लागू करने की कोशिश कर रहा हूं (उन्हें किसी उपयोगकर्ता द्वारा मक्खन करने से रोकने के लिए)। मैं JCA guide में कोड नमूने के लगभग समान का उपयोग कर रहा है, सिवाय:एन्क्रिप्टेड और एन्कोडेड यूआरएल स्ट्रिंग में लाइन ब्रेक से बचें

  • डेस का उपयोग कर (यह मानते हुए यह एईएस की तुलना में थोड़ा तेज है, और एक छोटे कुंजी की आवश्यकता है) और
  • Base64 एन/करने के लिए स्ट्रिंग डिकोडिंग सुनिश्चित करें कि यह एक यूआरएल के लिए सुरक्षित रहता है।

कारणों से मैं समझ नहीं पा रहा हूं, आउटपुट स्ट्रिंग लाइनब्रेक्स के साथ समाप्त होती है, जो मुझे लगता है कि काम नहीं करेगा। मैं यह नहीं समझ सकता कि इसका क्या कारण है। कुछ ऐसे संसाधनों पर सुझाव जो कुछ अन्य संसाधनों को पढ़ने के लिए आसान या पॉइंटर्स हैं? मुझे अपने सिर (और ओवरकिल) पर कुछ क्रिप्टोग्राफी संदर्भ मिल रहे हैं, लेकिन एक साधारण आरओटी 13 कार्यान्वयन काम नहीं करेगा क्योंकि मैं एक बड़े चरित्र सेट से निपटना चाहता हूं (और कुछ ऐसा करने के लिए समय बर्बाद नहीं करना चाहता उन अस्पष्ट पात्रों के साथ समस्याएं हैं जिनके बारे में मैंने नहीं सोचा था)।

नमूना इनपुट (कोई लाइन ब्रेक):

http://maps.google.com/maps?q=kansas&hl=en&sll=42.358431,-71.059773&sspn=0.415552,0.718918&hnear=Kansas&t=m&z=7 

नमूना आउटपुट (नीचे दिखाया गया है पंक्ति विराम):

GstikIiULcJSGEU2NWNTpyucSWUFENptYk4m5lD8RJl8l1CuspiuXiE9a07fUEAGM/tC7h0Vzus+ 
jAH6cT4Wtz2RUlBdGf8WtQxVDKZVOzKwi84eQh2kZT9T3KomlnPOu2owJ/2RAEvG+QuGem5UGw== 

मेरी एनकोड टुकड़ा:

final Key key = new SecretKeySpec(seed.getBytes(), "DES"); 
final Cipher c = Cipher.getInstance("DES"); 
c.init(Cipher.ENCRYPT_MODE, key); 
final byte[] encVal = c.doFinal(s.getBytes()); 
return new BASE64Encoder().encode(encVal); 
+1

क्या आपने बस अपने एन्कोडिंग सेशन को वापस करने की कोशिश की और देखें कि क्या यह काम करता हैं ? – Snicolas

+0

वह BASE64Encoder कक्षा कहां से आती है? – leonbloy

+1

@leonbloy मैं sun.misc.BASE64Decoder आयात कर रहा था, जिसे मुझे [इस पोस्ट] के लिए धन्यवाद मिला है (http://stackoverflow.com/questions/2267036/work-sun-misc-base64encoder-decoder-for-getting- बाइट) एक अच्छा विचार नहीं है। – milletron

उत्तर

7

Base64 आमतौर पर encoders कुछ अधिकतम रेखा लगाएं (खंड) लंबाई, और न्यूलाइन जोड़ता है जब ne cessary। आप इसे सामान्य रूप से कॉन्फ़िगर कर सकते हैं, लेकिन यह विशेष कोडर कार्यान्वयन पर निर्भर करता है। उदाहरण के लिए, Apache Commons की कक्षा में linelength विशेषता है, इसे शून्य (या नकारात्मक) पर सेट करने से लाइन अलगाव अक्षम हो जाता है।

बीटीडब्लू: मैं दूसरे जवाब से सहमत हूं कि आज डीईएस शायद ही सलाह दी जाती है। इसके अलावा, क्या आप बस "obfuscating" या वास्तव में एन्क्रिप्टिंग कर रहे हैं? कुंजी कौन है? पूरी बात मुझे बहुत अच्छी तरह से गंध नहीं करती है।

+0

पर एक और हल्का, खुला स्रोत कार्यान्वयन है, यह वास्तव में एन्क्रिप्टिंग से अधिक obfuscating है। कॉलिंग क्लास में "कुंजी" के रूप में बस एक हार्डकोडेड स्ट्रिंग का उपयोग करना (जिसे obfuscated urls उत्पन्न करने और उपभोग करने वाले servlets द्वारा साझा किया जाता है)। अपरैच कॉमन्स एन्कोडर कहता है कि "जेरी कॉफ़िन – milletron

+0

द्वारा लिनलेथेंथ लीड के लिए भी धन्यवाद" ... यह निम्न 127 एएससीआईआई चार्ट के साथ संगत चरित्र एन्कोडिंग को केवल एन्कोड/डीकोड करने के लिए कड़ी-कोडित है, यह जीता ' मैं किसी भी काम नहीं करता क्योंकि मेरे पास इस सीमा के बाहर के पात्र होंगे। मुझे लगता है कि इस पूरे दृष्टिकोण पर पुनर्विचार की जरूरत है, मुझे लगता है। – milletron

+0

"यह किसी भी काम नहीं करेगा क्योंकि मेरे पास इस श्रेणी के बाहर के पात्र होंगे": ध्यान से पढ़ें: यह ASCII के बाहर के पात्रों के साथ काम करता है, यह सिर्फ बाइनरी एन्कोडिंग utf-16 नहीं हो सकता है, लेकिन यह utf-8 हो सकता है, या आईएसओ -885 9 -1, आदि – leonbloy

1

आम तौर पर धीमी एईएस (कम से कम सॉफ्टवेयर में) की तुलना में है, इसलिए जब तक आप वास्तव में कुंजी छोटे रखने की जरूरत है, एईएस लगभग निश्चित रूप से एक बेहतर विकल्प है हालांकि यह अपने वास्तविक प्रश्न से संबंधित न हो, डेस है।

दूसरा, यह पूरी तरह से सामान्य है कि एन्क्रिप्शन (डीईएस या एईएस) अपने आउटपुट में नए-पंक्ति वर्णों का उत्पादन करेगा। उनके बिना उत्पादन का उत्पादन बेस -64 एन्कोडर तक पूरी तरह से होगा, इसलिए वह जगह है जहां आपको स्पष्ट रूप से देखने की आवश्यकता है।

हालांकि इसके उत्पादन में नियमित अंतराल पर बेस -64 डालने वाले नए-पंक्ति वर्णों को देखना विशेष रूप से आश्चर्यजनक नहीं है। बेस -64 एन्कोडिंग के लिए सबसे आम उपयोग कच्चे डेटा को ईमेल के शरीर की तरह कुछ में डाल रहा है, जहां वास्तव में एक लंबी लाइन समस्या का कारण बनती है। इसे रोकने के लिए, डेटा टुकड़ों में टूट जाता है, आमतौर पर 80 से अधिक कॉलम (और आमतौर पर थोड़ा कम) नहीं। इस मामले में, नई लाइनों को अनदेखा किया जाना चाहिए, हालांकि, यदि स्मृति सेवा करता है, तो आप उन्हें हटाने में सक्षम होना चाहिए।

11

एन्कोडेड स्ट्रिंग पर बस base64Str = base64Str.replaceAll("(?:\\r\\n|\\n\\r|\\n|\\r)", "") निष्पादित करें।

यह ठीक काम करता है जब आप इसे बाइट्स पर डीकोड करने का प्रयास करते हैं। मैंने इसे कई बार यादृच्छिक जेनरेट बाइट सरणी के साथ परीक्षण किया था।स्पष्ट रूप से डिकोडिंग प्रक्रिया केवल न्यूलाइन को अनदेखा करती है या तो वे मौजूद हैं या नहीं। मैंने com.sun.org.apache.xml.internal.security.utils.Base64 का उपयोग करके इस "पुष्टि कार्य" का परीक्षण किया अन्य परीक्षणकर्ताओं का परीक्षण नहीं किया गया।

+2

यह उत्तर बहुत बढ़िया है, इच्छा है कि मैं 10 बार ऊपर उठा सकूं। –

+1

अच्छा अभ्यास या नहीं, किसी को टिप्पणी करनी चाहिए, लेकिन आपने मेरा दिन बचाया धन्यवाद श्रीमान – dakait

+0

बहुत बढ़िया। एक त्वरित निजी उपयोग पर काम करना, और इसने मुझे रोकने के लिए और तीसरे पक्ष के बेस 64 एन्कोडर को खोजने से बचाया। – developerwjk

1

वीए एनकोड टुकड़ा से ...

बदल देते हैं:

return new BASE64Encoder().encode(encVal); 

साथ:

return new android.util.Base64.encodeToString(encVal, Base64.NO_WRAP); 

हमारे परिणाम से बाहर लाइन ब्रेक दूर करने के लिए

import android.util.Base64; 

... 

return new BASE64.encodeToString(encVal, Base64.NO_WRAP); 
+0

क्या आप अपने उत्तर पर थोड़ा सा विस्तार कर सकते हैं? –

+0

वीए के एन्कोड स्निपेट से, हम "नया BASE64Encoder()। एन्कोड (encVal) लौटाते हैं;" "वापस नया android.util.Base64.encodeToString (encVal, Base64.NO_WRAP);" हमारे परिणाम से लाइन-ब्रेक को हटाने के लिए। – user2955935

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