2017-01-24 8 views
2

Возможно, я сумасшедший, но, похоже, знаменитый код для запуска Base64 в VB вставляет символ новой строки (ascii 10) в 73-ю позицию, что впоследствии делает кодированную строку недействительной для базовой проверки подлинности - или что-то еще в этом отношении ,Base64 encode with Stream_StringToBinary вставляет новую строку, разбивая строку?

Оригинальный код:

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, должны игнорироваться программным обеспечением для декодирования. В базовых64 данные, символы, отличные от данных в таблице 1, разрывы строк и другие пробелы , вероятно, указывают на ошибку передачи, о которой должно быть сообщено предупреждение или даже отказ от сообщения при некоторых обстоятельствах.

Потому что добавление vbLf(Chr(10)) после кодирования должно означать, что вы в безопасности, чтобы просто удалить его с помощью

strEnc = Replace(strEnc, vbLf, "") 

Некоторые языки имеют «не упаковочную» аргумент, который может быть переданный, чтобы остановить добавление Linefeed после 76-го символа, но я не знаю об одном в реализации XML XMLDOM, отмеченном здесь Base64 -- do we really want/need line breaks every 76 characters?, похоже, что это было предложено, но нет никаких доказательств того, что он когда-либо был реализован.

+0

Хороший улов. Избивает меня, почему MS добавляет перерыв на 73-м, хотя. Я потратил довольно много времени на провал Basic Auth over 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-файлах. –

 Смежные вопросы

  • Нет связанных вопросов^_^