小程序安全性加固的三个方法

小程序的流行,安全性问题也日益凸显。用户数据泄露和恶意攻击威胁着用户的隐私和安全。本文将重点讨论小程序安全性加固的方法,以保护用户数据和防止恶意攻击。

代码加固

‌代码加密和混淆:通过‌字符串加密、‌属性加密、‌调用转换和代码混淆等技术,防止代码暴露和逻辑分析。这些措施可以增加攻击者阅读和理解代码的难度,从而保护小程序的逻辑和数据安全

小程序官方插件

为提高微信开放平台生态安全性,针对小程序开发过程中的安全问题,如代码易被反编译,核心业务逻辑被破译,算法易被二次打包等,导致小程序存在被破解、核心代码被盗取的风险。平台将提供代码加固功能,可实现对小程序前端代码进行加密,以防止代码暴露,提高攻击者阅读前端代码逻辑的难度,同时开发者也应注意自身开发规范的严谨性,保证小程序的代码质量,保护小程序安全。小程序代码加固是提供给开发者对小程序前端代码进行加密的功能,以防止代码暴露。

代码加固功能为官方提供的一款插件,只需在微信开发者工具中直接进行安装即可,操作便捷,无需额外耗时,可将JavaScript文件传递给加密工具,从而实现字符串加密、属性加密、调用转换、代码混淆等多项保护措施。建议涉及小程序中的敏感数据信息、核心算法逻辑、版权内容等需要安全保护的内容,都可以进行代码加固。希望通过以下使用说明(运行环境、安装流程、使用流程、反查流程),能帮助开发者更好地运用该功能。

图片

code_obfuscation_config.json

{
    "desc": "关于本文件的更多信息,请参考文档 代码加固开发者文档",
    "switch": true, // 加固总开关,关闭则不执行加固流程
    "configs": [
    {
    "path": "pages/index/index.js", // 加固文件的路径
    "sub_switch": true // 加固子开关,该文件是否需要加固
    }
  ]
}

数据加固

数据是小程序中最重要的资产之一。保护用户数据的隐私是开发者的首要任务。为此,数据加密是一种常见的保护措施,小程序通过API接口与后端服务器进行数据交互,请求报文,返回报文加密解密。为了保证API接口的安全性,开发者应该采取措施防止恶意调用和数据篡改。在小程序中,开发者可以使用对称加密或非对称加密算法来保护数据。下面是一个示例,演示了如何在小程序中使用对称加密:

javaScript

import CryptoJS from 'crypto-js'

let keyStr = `qwer`
let signSecret = `ckwx`

const encrypt = (word) => {
  // 加密
  var key = CryptoJS.enc.Utf8.parse(keyStr)
  var srcs = CryptoJS.enc.Utf8.parse(word)
  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  }) // 加密模式为ECB,补码方式为PKCS5Padding(也就是PKCS7)
  return encrypted.toString()
}

export const decrypt = (word) => {
  // 解密
  var key = CryptoJS.enc.Utf8.parse(keyStr)
  var decrypt = CryptoJS.AES.decrypt(word, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  })
  return CryptoJS.enc.Utf8.stringify(decrypt).toString()
}

java


/**
 * Description: 配合前端CryptoJS实现加密、解密工作。
 * CryptoJS 是一个 JavaScript 库,提供了一系列密码学函数和工具,用于加密、解密、生成摘要等任务。
 * 它支持多种加密算法,包括常见的对称加密算法(如 AES、DES)和非对称加密算法(如 RSA)。
 */
public class CryptoUtil {

    private final static String IV = "qwer";//需要前端与后端配置一致
    private final static String KEY = "ckwx";

    /**
     * 加密算法,使用默认的IV、KEY
     * @param content
     * @return
     */
    public static String encrypt(String content){
        return encrypt(content,KEY,IV);
    }

    /**
     * 解密算法,使用默认的IV、KEY
     * @param content
     * @return
     */
    public static String decrypt(String content){
        return decrypt(content,KEY,IV);
    }
    /**
     * 加密方法
     * @param content
     * @param key
     * @param iv
     * @return
     */
    public static String encrypt(String content, String key, String iv){
        try{
            // "算法/模式/补码方式"NoPadding PkcsPadding
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            int blockSize = cipher.getBlockSize();
            byte[] dataBytes = content.getBytes();
            int plaintextLength = dataBytes.length;
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
            }
            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("UTF-8"));
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);
            return new Base64().encodeToString(encrypted);
        }catch (Exception e) {
            throw new RuntimeException("加密算法异常 CryptoUtil encrypt()加密方法,异常信息:" + e.getMessage());
        }
    }

    /**
     * 解密方法
     * @param content
     * @param key
     * @param iv
     * @return
     */
    public static String decrypt(String content, String key, String iv){
        try {
            byte[] encrypted1 = new Base64().decode(content);
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            byte[] original = cipher.doFinal(encrypted1);
            return new String(original).trim();
        } catch (Exception e) {
            throw new RuntimeException("加密算法异常 CryptoUtil decrypt()解密方法,异常信息:" + e.getMessage());
        }
    }
}

此外,为了保护用户数据,小程序开发者还应该遵循最小权限原则,只收集和使用必要的数据,并定期清理不再需要的数据

THE END