网易云音乐新API分析

老api日益泛滥,网易终于改了API。下面以登录为例,对新API进行简单的分析。

Url

估计会抓包的人都知道,Url中的api便成了weapi。比如手机登录:
原来是:http://music.163.com/api/login/cellphone/
现在是:http://music.163.com/weapi/login/cellphone/

加密算法

核心过程如下:

1
2
3
4
5
6
7
aesRsaEncrypt = function (text, pubKey, modulus, nonce) {
var secKey = createSecretKey(16);
return {
encText : aesEncrypt(aesEncrypt(text, nonce), secKey),
encSecKey : rsaEncrypt(secKey, pubKey, modulus)
}
}

其中_modulus\nonce\pubKey均为已知(见输入),算法先通过createSecretKey生成一个16位的随机字符串作为密钥secKey,然后将明文text进行两次AES加密获得密文encText,因为secKey是在客户端上生成的,所以还需要对其进行RSA加密再传给服务端。

输入

1
2
3
4
5
6
{
Text: JSON.stringify({phone:"xxx",password:"md5 hashed Data",rememberLogin:"true"})
pubKey: 010001
nonce: 0CoJUm6Qyw8W8jud
modulus: 00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
}

输出

1
2
3
4
{
params:encText,
encSecKey:encSecKey
}

一些细节

  1. AES加密的具体算法为:AES-128-CBC,输出格式为base64。
  2. AES加密时需要指定iv:0102030405060708
  3. RSA加密时明文需要反转,输出为Hex格式,公钥是{N:modulus,e:pubKey}
  4. RSA算法过程是:convertUtf8toHex(reversedText)^e%N,若不足长度前方补0
  5. 我的Javascript实现:https://github.com/stkevintan/nw_musicbox/blob/master/src/model/Crypto.js
  6. RSA算法的JS实现方法参考:http://www.cnblogs.com/kxdhm/archive/2012/02/02/2336103.html