使用Stream_StringToBinary的Base64编码插入换行符,打破字符串?

时间:2017-01-24 19:59:21

标签: encoding vbscript base64

也许我疯了,但看起来在VB中运行Base64的着名代码在第73个位置插入换行符(ascii 10),这使得编码字符串无法用于基本身份验证 - 或其他任何内容就此而言。

原始代码:

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对上。

有没有人遇到过这个?

1 个答案:

答案 0 :(得分:2)

这是因为Base64编码处理长字符串的方式。

  

来自RFC 2045 - 6.8 Base64 Content-Transfer-Encoding
  编码的输出流必须以的行数表示      每个<76个字符。所有换行符或其他字符都没有      解码软件必须忽略表1中的内容。在base64中      数据,表1中的字符以外的字符,换行符等      空白区域可能表示传输错误,其中a      警告消息甚至消息拒绝可能是适当的      在某些情况下。

因为在编码后添加vbLf Chr(10)意味着您可以安全地使用

删除它
strEnc = Replace(strEnc, vbLf, "")

某些语言有一个“无包装”参数可以传递以停止在第76个字符后添加换行符但我不知道Microsoft XMLDOM实现中的一个,在此处注明Base64 -- do we really want/need line breaks every 76 characters?它看起来像虽然有人建议,但没有证据表明它已经实施过。