2009-09-11 9 views
6

यूआरएल सुरक्षित आधार 64 एन्कोडिंग को देखने में, मुझे यह एक बहुत ही गैर-मानक चीज़ माना गया है। PHP में किए गए कार्यों में निर्मित संख्या की संख्या के बावजूद, यूआरएल सुरक्षित बेस 64 एन्कोडिंग के लिए कोई नहीं है।बेस 64 एन्कोडिंग यूआरएल सुरक्षित बनाने के लिए कौन सा चरित्र प्रतिस्थापन किया जाना चाहिए?

function base64_url_encode($input) 
{ 
    return strtr(base64_encode($input), '+/=', '-_,'); 
} 

केवल पर्ल मॉड्यूल मैं इस क्षेत्र में मिल सकता है MIME::Base64::URLSafe (source) है, जो निम्नलिखित प्रतिस्थापन आंतरिक रूप से करता है: base64_encode() के लिए मैनुअल पृष्ठ पर, टिप्पणी के सबसे कि समारोह, strtr() साथ लिपटे उपयोग करने का सुझाव:

sub encode ($) { 
    my $data = encode_base64($_[0], ''); 
    $data =~ tr|+/=|\-_|d; 
    return $data; 
} 

ऊपर पीएचपी समारोह के विपरीत, इस पर्ल संस्करण बल्कि साथ ',' (अल्पविराम) पीएचपी करता है के रूप में यह जगह की तुलना में पूरी तरह से '=' (के बराबर होती है) चरित्र चला जाता है,। बराबर एक पैडिंग चरित्र है, इसलिए पर्ल मॉड्यूल उन्हें डीकोड पर आवश्यकतानुसार बदल देता है, लेकिन यह अंतर दो कार्यान्वयन को असंगत बनाता है।

from base64 import urlsafe_b64encode, urlsafe_b64decode 

def uri_b64encode(s): 
    return urlsafe_b64encode(s).strip('=') 

def uri_b64decode(s): 
    return urlsafe_b64decode(s + '=' * (4 - len(s) % 4)) 

इच्छा यहां है:

अंत में, अजगर समारोह urlsafe_b64encode(s) गद्दी जो 'python base64 url safe' के लिए गूगल परिणामों में मुख्य रूप से पता चलता दूर करने के लिए this function ऊपर डाल करने के लिए '=' चारों ओर गद्दी रहता है, कोई उत्साह एक स्ट्रिंग जिसे बिना किसी एन्कोडिंग के यूआरएल में शामिल किया जा सकता है, इसलिए पात्रों '+', '/', और '=' के डायचिंग या अनुवाद। चूंकि कोई परिभाषित मानक नहीं है, सही तरीका क्या है?

उत्तर

9

वहाँ एक मानक होना दिखाई है, यह RFC 3548, धारा 4, आधार URL और फ़ाइल का नाम सुरक्षित वर्णमाला साथ 64 एन्कोडिंग है:

यह एन्कोडिंग, तकनीकी रूप से पिछले एक के समान है के लिए छोड़कर 62: nd और 63: वां वर्णमाला चरित्र, के रूप में तालिका में दी गई 2.

+ और / की जगह किया जाना चाहिए डी - (minus) और _ (understrike) क्रमशः। किसी भी असंगत पुस्तकालयों लपेटा जाना चाहिए ताकि वे RFC के लिए 3548.

नोट यह जरूरी है कि है कि आप (pad) = वर्ण सांकेतिक शब्दों में बदलना URL अनुरूप है, लेकिन मैं पसंद करते हैं कि यूआरएल मानक बेस 64 वर्णमाला से + और / वर्ण एन्कोडिंग से अधिक।

0

आप urlencode() में इसे लपेटने का प्रयास क्यों नहीं करते? प्रलेखन here.

+1

यह वर्णों की एक अनावश्यक संख्या का उपयोग करता है। क्यों पहली जगह बाइनरी स्ट्रिंग urlencode नहीं? – recursive

2

मैं urlencode के माध्यम से base64_encode के आउटपुट को चलाने का सुझाव देना चाहता हूं। उदाहरण के लिए:

function base64_encode_url($str) 
{ 
    return urlencode(base64_encode($str)); 
} 
1

आप सही तरीके के बारे में पूछ रहे हैं, तो मैं के रूप में पात्रों में से मनमाने ढंग से प्रतिस्थापन के लिए विरोध उचित यूआरएल एन्कोडिंग के साथ जाना चाहते हैं। पहले बेस 64-अपने डेटा को एन्कोड करें, फिर उचित URL-एन्कोडिंग (यानी %<code>) के साथ "=" जैसे विशेष वर्णों को एन्कोड करें।

+0

मैं पहले से ही उपलब्ध कार्यों का उपयोग कर नीचे हूं, लेकिन urlencode() का उपयोग करके बहुत अधिक लंबाई जोड़ सकते हैं। Y64 का उल्लेख करने और प्रश्न में कुछ संस्कृति जोड़ने के लिए –

8

मुझे नहीं लगता कि सही या गलत है।लेकिन सबसे लोकप्रिय एन्कोडिंग

'+/=' => '-_.' 

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

+0

+1 – jmserra

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