问题背景描述
后端使用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
所需要的参数格式)是否影响了输出结果?应该指定怎样的编码规则?
相关链接
后端使用的服务:(我其实没有很明白这个验证要怎么使用)
咨询后端base64编码过程后,改用了
CryptoJS.enc.Hex.parse()
方法,计算结果与命令行一致了。那么,我想我的问题应该变成了,
CryptoJS.enc.Hex
与CryptoJS.enc.Utf8
这两种编码方式有什么相同与不同之处?(原谅我的字符编码基础知识不牢靠)