记一次反编译过程

此文不涉及任何道义和伦理的讨论

尝试旧版本APP,查看对应的旧版本接口是否加密

安卓的历史版本可以通过hiapk下载,资源的链接一般类似这种形式: http://apk.hiapk.com/appinfo/com.maihaoche.bentley/1050805,最后的数字用于标识不同的版本号。 IOS的历史版本可以通过itunes下载,只需修改请求中携带的版本号即可下载不同版本,具体参见:iTunes下载 App Store 任意历史版本应用

应用接口的安全方案设计

鉴于当前日益严峻的行业竞争和用户的安全忧虑,我司近期上线了对全接口的安全监控,以下记录了方案设计过程中的一些想法。

HTTPS安全吗?

HTTPS可以在一定程度上隐藏接口调用的路径和参数,但是如果使用不当,依然会暴露在MIM攻击下,现在流行的网络调试工具都可以支持MIM。如Charles:

AES和RSA的JavaScript实现

创建node工程

新建node工程,导入crypto-jscrypto-browserify的npm包。 代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        var CryptoJS = require('crypto-js');
        var crypto = require('crypto-browserify');

        var key = '16位密钥';
        var rsaKeyStr = ''RSA公钥';
        var rsaBuffer = new Buffer(key);
        // 使用RSA公钥加密AES的密钥
        var cryptedData = crypto.publicEncrypt(rsaKeyStr, rsaBuffer);

        //定义向量
        var iv = 'qwertyuiasdfghjk';
        key = CryptoJS.enc.Utf8.parse(key);
        iv = CryptoJS.enc.Utf8.parse(iv);
        //使用AES加密加密内容,这里用new Object 代替
        var encrypted = CryptoJS.AES.encrypt(JSON.stringify(new Object(), key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });

        var encryptedObj = new Object();
        encryptedObj.mhcParams = encrypted.toString();
        encryptedObj.mhcToken = cryptedData.toString("base64");

注意有一个坑: crypto.publicEncrypt(public_key, buffer)传入的public_key参数可以是一个Object,** If public_key is a string, it is treated as the key with no passphrase and will use RSA_PKCS1_OAEP_PADDING** :如果是个string,默认采用RSA_PKCS1_OAEP_PADDING的padding方式。