0

问题背景描述

后端使用rails activeStorage的方式做文件上传,小程序端需要提交文件的Base64 Encoded MD5, 在上传的过程会验证上传的文件与所提供的MD5是否一致,现在测试的情况是:测试图片的MD5与命令行计算结果,但转换为base64编码后,结果有差异,导致图片校验错误,无法上传。所使用的md5和base64编码方式为:

命令行:
操作系统:macOS Mojave 10.14.4 (18E226)

md5 [文件]

(echo 0:; echo [MD5值]) | xxd -rp -l 16 | base64

上述方法可参见此文章

微信小程序

// 获取MD5
wx.getFileInfo({
  filePath: file.path,
  digestAlgorithm: 'md5'
})

// 获取文件Binary
let fileSystemManager = wx.getFileSystemManager()
let fileBinary = fileSystemManager.readFileSync(file.path, 'binary')

// Base64编码
import Base64 from 'crypto-js/enc-base64'
import Utf8 from 'crypto-js/enc-utf8'

Base64.stringify(Utf8.parse(res.digest))  // res.digest为上述wx.getFileInfo的结果

相关小程序API见:

问题

比较两者的结果发现,编码为base64后,命令行的结果为24位,结尾字符为"==", 而小程序端用CryptoJS计算的结果为44位,结尾字符为"="。因此,我的问题是:32位的md5字符串,用base64编码后应该是多少位?是否可以指定要编码为多少位?上述我使用CryptoJS的时候,用Utf8.parse()将结果先转换为WordArray的格式(Base64.stringify所需要的参数格式)是否影响了输出结果?应该指定怎样的编码规则?

相关链接

后端使用的服务:(我其实没有很明白这个验证要怎么使用)

bolelee 1k
2019-06-12 提问
1 个回答
0

咨询后端base64编码过程后,改用了CryptoJS.enc.Hex.parse()方法,计算结果与命令行一致了。

import Base64 from 'crypto-js/enc-base64'
import Hex from 'crypto-js/enc-hex'

console.log(Hex.parse(res.digest))
console.log(Hex.parse(res.digest).toString())
console.log(Base64.stringify(Hex.parse(res.digest))) // 想要的`Base64 Encoded MD5`

那么,我想我的问题应该变成了,CryptoJS.enc.HexCryptoJS.enc.Utf8这两种编码方式有什么相同与不同之处?(原谅我的字符编码基础知识不牢靠)

撰写答案

推广链接