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

问你个 js base64 和 md5 的问题

  •  
  •   feijilei · 2015-01-16 23:49:05 +08:00 · 2887 次点击
    这是一个创建于 3632 天前的主题,其中的信息可能已经有所发展或是发生改变。
    为什么下面这串字符,用js 先base64_decode 然后再md5 下和php 下得到的值不一样,我用php得到的结果是2d45bc98101326f147cc0f21ca8cd162,你们用js 试试看,看看结果是什么?

    BvkmoUl5IixfrqzaSTqfcjY3eA51Hpr1pjZPag==


    备注:
    js base64 用的这个库https://github.com/dankogai/js-base64
    js md5 用的这个库 http://pajhome.org.uk/crypt/md5/2.2/md5-min.js
    11 条回复    2015-01-17 11:49:18 +08:00
    sneezry
        1
    sneezry  
       2015-01-16 23:52:28 +08:00
    算法和语言无关,你js库的问题吧
    feijilei
        2
    feijilei  
    OP
       2015-01-16 23:58:11 +08:00
    @sneezry 库是网上找的,试了好几个其他库都不行,我用php 和python 跑出的结果一致,唯独js 不行,有空帮忙看看否
    sneezry
        3
    sneezry  
       2015-01-17 00:00:17 +08:00
    @feijilei 2d45bc98101326f147cc0f21ca8cd162 这个结果我都木有试出来……

    是 md5( base64('BvkmoUl5IixfrqzaSTqfcjY3eA51Hpr1pjZPag==') ) ?
    sneezry
        4
    sneezry  
       2015-01-17 00:00:34 +08:00
    啊,decode,看错了
    feijilei
        5
    feijilei  
    OP
       2015-01-17 00:01:35 +08:00
    @sneezry 是这个意思,php 和python 跑出的结果都是2d45bc98101326f147cc0f21ca8cd162
    emric
        6
    emric  
       2015-01-17 00:19:26 +08:00
    换成 cryptojs 吧, 久经考验的库.
    我测试了下完全没有问题, 和后端程序的结果一样.
    yfdyh000
        7
    yfdyh000  
       2015-01-17 00:20:45 +08:00
    sneezry
        8
    sneezry  
       2015-01-17 00:23:34 +08:00
    @feijilei 原因找到了。php和python默认以iso-8859-1编码字符串,而js以utf-8编码字符串

    echo md5(iconv("ISO-8859-1","utf-8", base64_decode('BvkmoUl5IixfrqzaSTqfcjY3eA51Hpr1pjZPag==')));

    这个结果和js的结果就是一样的了。

    所以问题解决的办法是把通过js base64解码后得到的字符串转码成iso-8859-1。

    理论上decodeURIComponent(escape(str));应该可以解决的,但是Chrome报错 =S,所以这里你需要自己研究一下。

    另外,js里源生有base64函数,不用依赖库。

    btoa(str)是编码,atob(str)是解码。

    不过编码只能对iso-8859-1编码的字符串进行,ascii里的没问题,汉字什么的就得多一步操作:

    btoa(unescape(encodeURIComponent(str)));

    以上。
    sneezry
        9
    sneezry  
       2015-01-17 00:45:26 +08:00
    @feijilei 搞定了 ;)

    console.log(rstr2hex(rstr_md5(atob('BvkmoUl5IixfrqzaSTqfcjY3eA51Hpr1pjZPag=='))));
    feijilei
        10
    feijilei  
    OP
       2015-01-17 11:18:55 +08:00
    @sneezry 你这些函数ie 不支持把
    sneezry
        11
    sneezry  
       2015-01-17 11:49:18 +08:00 via iPhone
    @feijilei atob就是base64_decode,md5相关的是你找的库里的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5085 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:43 · PVG 13:43 · LAX 21:43 · JFK 00:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.