也许我疯了,但看起来在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对上。
有没有人遇到过这个?
答案 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?它看起来像虽然有人建议,但没有证据表明它已经实施过。