2017-01-24 24 views
2

也許我很瘋狂,但它看起來像在VB中運行Base64的着名代碼在第73個位置插入一個換行符(ascii 10),隨後使編碼的字符串對基本身份驗證無效 - 或者其他任何事情。使用Stream_StringToBinary進行Base64編碼會插入一個換行符,打破字符串?

原始代碼:

Function Stream_StringToBinary(Text) 
    Const adTypeText = 2 
    Const adTypeBinary = 1 

    'Create Stream object 
    Dim BinaryStream 'As New Stream 
    Set BinaryStream = CreateObject("ADODB.Stream") 

    'Specify stream type - we want To save text/string data. 
    BinaryStream.Type = adTypeText 

    'Specify charset For the source text (unicode) data. 
    BinaryStream.CharSet = "us-ascii" 

    'Open the stream And write text/string data To the object 
    BinaryStream.Open 
    BinaryStream.WriteText Text 

    'Change stream type To binary 
    BinaryStream.Position = 0 
    BinaryStream.Type = adTypeBinary 

    'Ignore first two bytes - sign of 
    BinaryStream.Position = 0 

    'Open the stream And get binary data from the object 
    Stream_StringToBinary = BinaryStream.Read 

    Set BinaryStream = Nothing 
End Function 


Function Base64Encode(sText) 
    Dim oXML, oNode 

    Set oXML = CreateObject("Msxml2.DOMDocument.3.0") 
    Set oNode = oXML.CreateElement("base64") 
    oNode.dataType = "bin.base64" 
    oNode.nodeTypedValue =Stream_StringToBinary(sText) 
    Base64Encode = oNode.text 
    Set oNode = Nothing 
    Set oXML = Nothing 
End Function 

'------------------- and here goes the encoding ----------------------- 
    strEnc = Base64Encode("AVERYLONGUSERNAMEHELLOTHE123:AVERYLONGPASSWORDWHYAREYOUSOLONGREALLYANNOY123") 
'----------------------------------------------------------------------  

結果:

QVZFUllMT05HVVNFUk5BTUVIRUxMT1RIRTEyMzpBVkVSWUxPTkdQQVNTV09SRFdIWUFSRVlP 
VVNPTE9OR1JFQUxMWUFOTk9ZMTIz 

看起來這發生在很長的UID/PWD對。

有沒有人遇到過這個?

回答

2

這是因爲Base64編碼如何處理長字符串。

RFC 2045 - 6.8 Base64 Content-Transfer-Encoding
編碼輸出流必須在不多 超過76個字符每線來表示。表1中的所有換行符或其他字符 必須被解碼軟件忽略。在base64 數據中,除了表1中的字符,換行符和其他 空白字符可能指示傳輸錯誤,在某些情況下,有關 警告消息或甚至消息拒絕可能適合 。

因爲它添加vbLfChr(10))編碼後應該意味着你可以安全使用

strEnc = Replace(strEnc, vbLf, "") 

只是將其刪除某些語言有一個「無包裝」的說法,可以是通過停止在第76個字符之後添加換行符,但我不知道Microsoft XMLDOM實現中的一個,這裏指出Base64 -- do we really want/need line breaks every 76 characters?它看起來好像有人提出,但沒有證據表明它已經實現。

+0

好的。打敗我爲什麼MS在第73位插入休息。我花了相當一段時間,只通過SSL驗證失敗的基本身份驗證來發現將它變成字符串的特殊字符。 –

+0

@access_granted這是一個奇怪的說老實話我猜他們不想超過最多76個字符,所以決定把它削減到72。 – Lankymart

+3

Base64編碼不限制行長度。這76個字符限制和您引用的RFC屬於MIME。必須引用[RFC 4648](https://tools.ietf.org/html/rfc4648),特別是[第3.1節](https://tools.ietf.org/html/rfc4648#section-3.1)。另一方面,72個字符的限制是從打字員時代開始的一種歷史性做法。作爲一個有趣的事實,您可以檢查這些RFC文件中行的最大長度。 –

相關問題