问你个 js base64 和 md5 的问题

2015-01-16 23:49:05 +08:00
 feijilei
为什么下面这串字符,用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
2869 次点击
所在节点    问与答
11 条回复
sneezry
2015-01-16 23:52:28 +08:00
算法和语言无关,你js库的问题吧
feijilei
2015-01-16 23:58:11 +08:00
@sneezry 库是网上找的,试了好几个其他库都不行,我用php 和python 跑出的结果一致,唯独js 不行,有空帮忙看看否
sneezry
2015-01-17 00:00:17 +08:00
@feijilei 2d45bc98101326f147cc0f21ca8cd162 这个结果我都木有试出来……

是 md5( base64('BvkmoUl5IixfrqzaSTqfcjY3eA51Hpr1pjZPag==') ) ?
sneezry
2015-01-17 00:00:34 +08:00
啊,decode,看错了
feijilei
2015-01-17 00:01:35 +08:00
@sneezry 是这个意思,php 和python 跑出的结果都是2d45bc98101326f147cc0f21ca8cd162
emric
2015-01-17 00:19:26 +08:00
换成 cryptojs 吧, 久经考验的库.
我测试了下完全没有问题, 和后端程序的结果一样.
yfdyh000
2015-01-17 00:20:45 +08:00
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
2015-01-17 00:45:26 +08:00
@feijilei 搞定了 ;)

console.log(rstr2hex(rstr_md5(atob('BvkmoUl5IixfrqzaSTqfcjY3eA51Hpr1pjZPag=='))));
feijilei
2015-01-17 11:18:55 +08:00
@sneezry 你这些函数ie 不支持把
sneezry
2015-01-17 11:49:18 +08:00
@feijilei atob就是base64_decode,md5相关的是你找的库里的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/162875

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX