Swift 和 golang 编码 base64 给出不同的结果

标签 swift security go base64 decode

我正在使用 swift 编码图像

let base64String = data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

编码字符串的前 222 个字符是 /9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABLKADAAQAAAABAAABLAAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ...

我使用 golang 编码了相同的图像

sEnc := base64.StdEncoding.EncodeToString(imageData)

编码字符串的前 224 个字符是 /9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIASwBLAMBIgACEQEDEQH/xAGiAAABBQEBAQEB...


当我使用

快速解码图像时
let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0))
var decodedimage = UIImage(data: decodedData!)

图像看起来完全一样。

当我在 golang 中解码 swift 生成的 base64 字符串时

dec, err := base64.StdEncoding.DecodeString(imageData)

解码 Base64 字符串时遇到错误:illegal base64 data at input byte 220这是 +特点。但是当我解码 golang 生成的 base64 时,输出正确。

为什么编码的字符串不同?我该如何修复它?

编辑:

Swift 最后 10 个字节 eqvr h/9k=
Golang 最后 10 个字节 cvdR//2Q==

编辑2:

在 Golang 中我使用 ioutil for reading file

b, err := ioutil.ReadFile(fileName)

编辑3:

添加了不同测试用例的结果 https://www.dropbox.com/sh/zd1wj7ppjedrx6a/AAAoX15iztTimtav6U_8IF4Ma?dl=0

最佳答案

使用 Swift 编码的字符串,这显然是 Photoshop 中生成的 JPEG(JFIF 是 JPEG 传输签名):

$ echo '/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABLKADAAQAAAABAAABLAAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs' | base64 -D | hexdump -C
00000000  ff d8 ff e0 00 10 4a 46  49 46 00 01 01 00 00 48  |......JFIF.....H|
00000010  00 48 00 00 ff e1 00 58  45 78 69 66 00 00 4d 4d  |.H.....XExif..MM|
00000020  00 2a 00 00 00 08 00 02  01 12 00 03 00 00 00 01  |.*..............|
00000030  00 01 00 00 87 69 00 04  00 00 00 01 00 00 00 26  |.....i.........&|
00000040  00 00 00 00 00 03 a0 01  00 03 00 00 00 01 00 01  |................|
00000050  00 00 a0 02 00 04 00 00  00 01 00 00 01 2c a0 03  |.............,..|
00000060  00 04 00 00 00 01 00 00  01 2c 00 00 00 00 ff ed  |.........,......|
00000070  00 38 50 68 6f 74 6f 73  68 6f 70 20 33 2e 30 00  |.8Photoshop 3.0.|
00000080  38 42 49 4d 04 04 00 00  00 00 00 00 38 42 49 4d  |8BIM........8BIM|
00000090  04 25 00 00 00 00 00 10  d4 1d 8c d9 8f 00 b2 04  |.%..............|
000000a0  e9 80 09 98 ec                                    |.....|
000000a5

使用 Golang 生成的字符串,不会出现这样的情况:

$ echo '/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIASwBLAMBIgACEQEDEQH/xAGiAAABBQEBAQEB' | base64 -D | hexdump -C
00000000  ff d8 ff db 00 84 00 08  06 06 07 06 05 08 07 07  |................|
00000010  07 09 09 08 0a 0c 14 0d  0c 0b 0b 0c 19 12 13 0f  |................|
00000020  14 1d 1a 1f 1e 1d 1a 1c  1c 20 24 2e 27 20 22 2c  |......... $.' ",|
00000030  23 1c 1c 28 37 29 2c 30  31 34 34 34 1f 27 39 3d  |#..(7),01444.'9=|
00000040  38 32 3c 2e 33 34 32 01  09 09 09 0c 0b 0c 18 0d  |82<.342.........|
00000050  0d 18 32 21 1c 21 32 32  32 32 32 32 32 32 32 32  |..2!.!2222222222|
00000060  32 32 32 32 32 32 32 32  32 32 32 32 32 32 32 32  |2222222222222222|
*
00000080  32 32 32 32 32 32 32 32  ff c0 00 11 08 01 2c 01  |22222222......,.|
00000090  2c 03 01 22 00 02 11 01  03 11 01 ff c4 01 a2 00  |,.."............|
000000a0  00 01 05 01 01 01 01 01                           |........|
000000a8

您需要发布完整的 Go 代码。看起来这就是有问题的代码。 0x32 的运行非常可疑。

关于Swift 和 golang 编码 base64 给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374733/

相关文章:

ios - Bundle.main.path(forResource :) returns nil

php - 使用 php include 的更好/更安全的方法?

go - 从 emersion/go-imap 获取原始消息

iphone - UI TableView 单元格在 swift 中使用 coredata 打开包含多个数据的新 View

arrays - 在 map View 上显示多个注释

swift - 从枚举的一个子部分中选择一个随机值

javascript - JavaScript 变量是否容易被恶意修改?

android - 展示如何使用 Android ID 认证的示例代码

go - Go 中的网络爬虫

go - 如何更改GO文件的默认输出文件夹路径?