美文网首页
网易云音乐api加密算法详解 2016.12.7

网易云音乐api加密算法详解 2016.12.7

作者: ioiogoo | 来源:发表于2016-12-07 10:54 被阅读0次

    本文旨在讲解网易云的加密算法,仅供参考,请不要用于非法用途。截止本文发布时间,此加密算法仍然适用。查看原文

    网易云音乐前段时间更改了api接口,将以前的GET请求变成了POST请求,并且POST的参数是加密后的参数,具体请看图片。为了突破爬虫限制,需要破解其中的加密算法。

    改进后POST请求参数如下:


    用于加密的核心代码如下(代码在http://s3.music.126.net/sep/s/2/core.js?06b50101e4968eb701d6b24cd94b48d2第11173行开始):

    生成随机16位字符串
    function a(a) {
            var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
            for (d = 0; a > d; d += 1)
                e = Math.random() * b.length,
                e = Math.floor(e),
                c += b.charAt(e);
            return c
        }
    
    AES加密函数
        function b(a, b) {
            var c = CryptoJS.enc.Utf8.parse(b)
              , d = CryptoJS.enc.Utf8.parse("0102030405060708")   偏移量已知
              , e = CryptoJS.enc.Utf8.parse(a)
              , f = CryptoJS.AES.encrypt(e, c, {
                iv: d,
                mode: CryptoJS.mode.CBC
            });
            return f.toString()
        }
    
    RSA加密函数
        function c(a, b, c) {
            var d, e;
            return setMaxDigits(131),
            d = new RSAKeyPair(b,"",c),
            e = encryptedString(d, a)
        }
    
    主入口
        function d(d, e, f, g) {
            var h = {}
              , i = a(16);
            return h.encText = b(d, g), 密钥g已知
            h.encText = b(h.encText, i),
            h.encSecKey = c(i, e, f),  e和f已知
            h
        }
    

    其中入口在function d处,传入的参数为:


    d是正常的请求参数
    e和f是RSA中加密所需的key和modulus
    g是AES加密的key

    function d中可以看出加密流程,先随机生成一个16位的密钥,将正常的请求参数与g先加密一次,再与16位的密钥加密一次,此结果为POST参数的param。由于密钥是在客户端上随机产生的,所以要将随机密钥进行一次RSA加密后作为encSecKey参数POST到服务端。

    所以,整体加密方式为,客户端生成16位密钥,将请求参数加密两次后,将参数加密后的结果和密钥加密后的结果一起传到服务端完成解密过程。

    相关文章

      网友评论

          本文标题:网易云音乐api加密算法详解 2016.12.7

          本文链接:https://www.haomeiwen.com/subject/laedmttx.html