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

Base64 encode with Stream_StringToBinary inserts a newline, breaking the string?

也许我疯了,但看起来 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 对上。

有人遇到过吗?

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

From RFC 2045 - 6.8 Base64 Content-Transfer-Encoding
The encoded output stream must be represented in lines of no more than 76 characters each. All line breaks or other characters not found in Table 1 must be ignored by decoding software. In base64 data, characters other than those in Table 1, line breaks, and other white space probably indicate a transmission error, about which a warning message or even a message rejection might be appropriate under some circumstances.

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

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

有些语言有一个 "no wrapping" 参数,可以传递该参数以停止在第 76 个字符后添加换行符,但我不知道 Microsoft XMLDOM 实现中有一个参数,请在此处注明 Base64 -- do we really want/need line breaks every 76 characters?看起来好像是有人建议的,但没有证据表明它曾经被实施过。