32位的md5字符串,用base64编码后应该是多少位?

发布于 2022-09-11 20:24:28 字数 1888 浏览 28 评论 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所需要的参数格式)是否影响了输出结果?应该指定怎样的编码规则?

相关链接

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蒗幽 2022-09-18 20:24:28

咨询后端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这两种编码方式有什么相同与不同之处?(原谅我的字符编码基础知识不牢靠)

橘香 2022-09-18 20:24:28

程序端需要提交文件的Base64 Encoded MD5, 在上传的过程会验证上传的文件与所提供的MD5是否一致,现在测试的情况是:测试图片的MD5与命令行计算结果,但转换为base64编码后,结果有差异,导致图片校验

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文