V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
BenchWidth
V2EX  ›  问与答

一个关于我的同事计算 md5 的问题!

  •  
  •   BenchWidth · 143 天前 · 13379 次点击
    这是一个创建于 143 天前的主题,其中的信息可能已经有所发展或是发生改变。
    由于项目的设计需要项目中资源上传的时候都是需要上传 md5 来校验文件,我是负责的网页前端与 java 后端部分的。

    昨天,ios 端的兄弟说有时候文件上传之后有时候地址是不能访问的(公司用的阿里云 oss )。我去看了一些发现了文件名有许多的奇奇怪怪的字符,被后台替换为空格了。我问了一些 ios 的兄弟他说的是算出来的 md5 值。我也问了一下安卓的兄弟,发现我们三端计算出来的文件 md5 都有自己的格式。(我自己写的前端和后端的计算方法得出的都是一样的 md5 )

    前端,java 后台:2cf8510722f63a433865b7b244738b22
    安卓:fuo0n0ga3rfs9qo5dd5qdmq8c
    ios:Z L6tJUcklneku8zMPoqcw==

    前端和 java 后台是我自己写所以怎么算都是一样的。主要是安卓和 iso 他们和我说编程语言不一样算出来的就是不一样的,而且 ios 他说没法算出我这种 md5 数值。

    我想的是 md5 难道不都是通过获取文件的二进制流再进行一系列的算法得出的一个固定的值嘛,难道说在不同的地方读取出来的文件二进制流不一样?或者说是使用的算法不一样?还是说只是他们没有找到方法而已?还是说是我自己算错了。

    大佬们,解决一下我的疑问吧!!!!!
    第 1 条附言  ·  142 天前
    附个言

    找了个新的文件又各个端计算了一次
    md5sum :c0724e99bef703ff443971d4d07785d2
    java :c0724e99bef703ff443971d4d07785d2
    安卓 : 60e979jfnn0fvk8ebhqj87f1ei
    ios : wHJOmb73A/9EOXHU0HeF0g==

    经过各位大佬的评论我一个个去尝试了一些找出了问题所在。

    我计算的 md5 是能和 linux 的 md5sum 对的上。没什么问题。

    安卓的 md5 是将 16 进制转换为了 32 进制。大文件计算的时候似乎没有将文件读取完就进行了 md5 计算。所以小文件得出的 md5 进行 16 进制转换后能与我的 md5 相对。大文件就对不上了。

    ios 的 md5 这个就要多谢#120 的老哥了。ios 是将算出来的 16 进制 32 位的 md5 进行了 10 进制转换,再将 10 进制转换为了 ASCII 对应的字符。再将得到的字符串进行了 base64 编码。(大文件也有对不上的问题)
    134 条回复    2020-12-25 10:56:25 +08:00
    1  2  
    qq2511296
        101
    qq2511296   143 天前
    把这个 iOS 开除了吧,太菜了,看这 iOS 是 base64 的格式
    JKeita
        102
    JKeita   143 天前
    MD5 这种标准算法使用频率那么高的都能搞错,建议直接开除得了,真丢人。
    lovecy
        103
    lovecy   143 天前
    @BenchWidth 你给的值我转了半天没有对上。。还以为我算错了。。
    另外那个 ios 的 base64,我这边 decode 也失败,手动把 md5 区 encode 也对不上。。
    怀疑人生中
    JKeita
        104
    JKeita   143 天前
    如果是我真直接怼了,这种都能搞错,完全不能忍。
    BenchWidth
        105
    BenchWidth   143 天前
    @lovecy 恼火。。。。。头大!啥时候我去给接口加个正则校验,md5 正则校验不通过的就不让他们传了。
    prodcd
        106
    prodcd   143 天前
    md5 结果大多时候都直接用 32 个 16 进制字符表示,java 那样是最常见形式。也有用 16 个字符的比较少见。安卓和 ios 还敢拿出来与你比较,明显水平不够,建议开除。
    安卓那个没看懂是什么算法,26 个字符,还有 u 、n 、g 、r……哪位高手给解释下?
    ios 的看起来像 base64,但我没解析出来,是不是把 md5 的 128bit 给 base64 了?
    AoEiuV020
        107
    AoEiuV020   143 天前
    一般说的 md5 指的是 hex(md5),也就是 md5 产生 16 字节数据之后再 16 进制编码产生 32 位字符串,一般还要统一规定大小写,认识这一点就好办了,
    然后空格大概率是 ios 的 base64 字符串出现加号+被后端框架自动解码成空格了,
    我这边规定加密算法时都会详细说明每一步,比如 hex(md5(aes(userId,md5(password)))),解释每一步并在每一步给个示例供其他端统一参考,
    linKnowEasy
        108
    linKnowEasy   143 天前
    @BenchWidth #105 建议让他们使用第三方库吧. 自己先在网上 对照什么在线 MD5 工具....
    AlbertWei
        109
    AlbertWei   143 天前
    iOS 程序员风评被害,建议开除。
    zhengdai1990
        110
    zhengdai1990   143 天前
    牛逼了,你们这开发都啥水平
    znyq2019
        111
    znyq2019   143 天前
    iOS 风评日下啊 太难了
    ai277014717
        112
    ai277014717   143 天前
    这帮人写完了不本地验证一下吗
    Blanke
        113
    Blanke   143 天前
    编程语言不一样算出来的就是不一样的,而且 ios 他说没法算出我这种 md5 数值?
    说这种话的,建议开除
    zachlhb
        114
    zachlhb   143 天前 via Android
    编码不同,转成统一的编码方式
    leapV3
        115
    leapV3   143 天前
    ios 是 base64,而且 md5 是一个统一算法,同样的数据,获得结果应该一样
    leapV3
        116
    leapV3   143 天前
    而且安卓还是 25 位 这是有其它操作吧
    codespots
        117
    codespots   143 天前
    @Blanke 和语言有什么关系? md5 是一个算法,按照规范实现,一千万种语言出来的结果都是一样的
    codespots
        118
    codespots   143 天前
    @Blanke sorry,看错了,以为是你说的
    Misakiye
        119
    Misakiye   143 天前
    “编程语言不一样算出来的就是不一样的”哈哈哈哈哈哈哈
    sxbxjhwm
        120
    sxbxjhwm   143 天前
    ios 这个。。勉强是个 hash 吧
    ```
    var str = atob('Z+L6tJUcklneku8zMPoqcw=='), op = '';
    for (var i in str) {
    op += str[i].charCodeAt().toString(16);
    }
    console.log(op); // 67e2fab4951c9259de92ef3330fa2a73
    ```
    felixcode
        121
    felixcode   143 天前
    你用 amd 算的,他用 intel 算的,当然不一样了。
    Bigglesworth
        122
    Bigglesworth   143 天前
    @imdong #25 哈哈哈,最后没想到,这是 oppo 被黑的最惨的一次
    efaun
        123
    efaun   143 天前
    开除开除
    Elethom
        124
    Elethom   143 天前 via iPhone
    @lovecy
    我也不知道什么情况。讲道理我还真第一次见会输出 32 进制的。
    Goat121
        125
    Goat121   143 天前
    不开除留着过年?
    Actrace
        126
    Actrace   143 天前
    面试的时候。
    面试官:“md5 算法你会吗?”
    同事 B:“没问题,!@#@#%!@##”

    干活的时候。
    同事 A:“算一下文件 md5 传过来”
    同事 B:“没问题”

    ```PHP

    md5($file_name);

    ```
    xxbutoo
        127
    xxbutoo   142 天前
    @Actrace 我凑 不带这么黑 php 的
    nuk
        128
    nuk   142 天前
    快把 android 的开了吧,别的好歹能猜出是什么,这个根本都不知道是啥玩意,啥 32 进制啊,base32 都不是。
    Rorysky
        129
    Rorysky   142 天前
    妈呀,这都是什么神仙
    Lonely
        130
    Lonely   142 天前 via iPhone
    ios 的干脆就是个 base64,而且解码后的长度也不对;你可以把 md5 的工具类跟安卓共享一下
    syhily
        131
    syhily   142 天前
    不就是算完之后 HEX 么?
    dbpe
        132
    dbpe   142 天前
    @felixcode 笑死我了......你们不同时间点算得也不同
    nopysiu
        133
    nopysiu   142 天前
    @imdong 这是 oppo 被黑的最惨的一次
    laoyur
        134
    laoyur   142 天前
    都在喷 iOS,但好歹一眼能看出是 base64
    安卓那个输出的又是什么鬼?
    1  2  
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2029 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:38 · PVG 23:38 · LAX 08:38 · JFK 11:38
    ♥ Do have faith in what you're doing.