开篇:万物互联时代的安全短板
随着智能手机和物联网设备的普及,攻击面已经从传统的服务器和 PC 扩展到了数十亿的移动设备和 IoT 终端。这些设备往往具有资源受限、更新困难、物理暴露等特点,成为安全防护的薄弱环节。一个被攻破的智能摄像头可能成为攻击内网的跳板,一个存在漏洞的 OTA 更新机制可能导致百万设备被控制。
本章将系统介绍移动应用安全和物联网安全的独特挑战与防护方案。
一、移动应用安全
1.1 OWASP MASVS(移动应用安全验证标准)
| 级别 | 要求 | 适用场景 |
|---|---|---|
| L1 | 标准安全(反编译防护、传输加密、输入验证) | 普通应用 |
| L2 | 深度防御(代码混淆、白盒加密、防调试) | 金融/支付 |
| R | 弹性防护(运行时自我保护、抗篡改) | 高价值目标 |
1.2 常见漏洞与防护
// ❌ 硬编码密钥
public class ApiConfig {
public static final String API_KEY = "sk_live_abcdef123456";
}
// ✅ 使用 Android Keystore/System Store
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES", "AndroidKeyStore");
keyGenerator.init(new KeyGenParameterSpec.Builder("api_key", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setRandomizedEncryptionRequired(true)
.build());
SecretKey key = keyGenerator.generateKey();
1.3 代码混淆与加固
// Flutter 混淆配置
// android/app/proguard-rules.pro
-obfuscationdictionary dict.txt
-classobfuscationdictionary dict.txt
-packageobfuscationdictionary dict.txt
# 混淆类名和方法名
-repackageclasses ''
-allowaccessmodification
# Flutter 特定规则
-keep class io.flutter.app.** { *; }
-keep class com.example.myapp.** { *; }
一句话总结:移动安全的核心是"假设设备不可信"——代码会被反编译、数据会被拦截、存储会被读取,因此需要在每一层都加密和防护。
二、物联网安全
2.1 设备认证
// IoT 设备 X.509 证书认证(MQTT over TLS)
#include "mbedtls/ssl.h"
// 设备预置唯一证书(出厂烧录)
const char* device_cert =
"-----BEGIN CERTIFICATE-----\n"
"MIICiDCCAi2gAwIBAgIUJ...\n"
"-----END CERTIFICATE-----";
const char* device_key =
"-----BEGIN RSA PRIVATE KEY-----\n"
"MIIEowIBAAKCAQEAy8Db...\n"
"-----END RSA PRIVATE KEY-----";
// 连接 AWS IoT Core
void mqtt_connect() {
mbedtls_ssl_context ssl;
mbedtls_ssl_init(&ssl);
// 加载设备证书
mbedtls_x509_crt_parse(&client_cert, device_cert, strlen(device_cert)+1);
mbedtls_pk_parse_key(&client_key, device_key, strlen(device_key)+1, NULL, 0);
mbedtls_ssl_conf_own_cert(&ssl_conf, &client_cert, &client_key);
mbedtls_ssl_conf_ca_chain(&ssl_conf, &ca_cert, NULL);
// 双向 TLS 认证
connect_to_broker(&ssl);
}
2.2 OTA 安全更新
# OTA 安全更新流程
def verify_and_apply_update(update_package):
"""
1. 验证签名(厂商公钥)
2. 验证固件完整性(哈希校验)
3. 验证固件版本(防回滚)
4. 写入备用分区
5. 标记新固件有效
6. 重启切换分区
"""
# 1. 签名验证
if not verify_signature(update_package, manufacturer_pubkey):
raise SecurityError("Invalid signature")
# 2. 完整性校验
expected_hash = update_package.manifest['sha256']
actual_hash = sha256(update_package.firmware).hexdigest()
if expected_hash != actual_hash:
raise SecurityError("Hash mismatch")
# 3. 版本检查(防回滚)
current_version = get_current_version()
new_version = update_package.manifest['version']
if new_version <= current_version:
raise SecurityError("Rollback detected")
# 4-6. 原子更新(A/B 分区)
write_to_inactive_partition(update_package.firmware)
mark_partition_valid()
reboot()
2.3 安全启动(Secure Boot)
Secure Boot 信任链:
Boot ROM(硬件信任根,不可变)
↓ 验证
Bootloader(签名验证通过才能执行)
↓ 验证
Kernel(操作系统内核)
↓ 验证
RootFS(文件系统完整性)
验证失败 → 进入恢复模式/拒绝启动
一句话总结:IoT 安全的关键是"防篡改"——安全启动确保只有授权固件能运行,OTA 签名保证更新不被劫持,设备证书实现双向认证。
FAQ
Q1: 物联网设备资源受限,如何实现加密?
- 使用轻量级算法:ChaCha20-Poly1305 比 AES-GCM 在小型设备上更快
- 硬件加速:利用设备自带的加密引擎(AES-NI、硬件 RNG)
- 会话密钥缓存:减少非对称加密操作
Q2: 如何应对大规模 IoT 僵尸网络(如 Mirai)?
- 出厂默认密码强制修改
- 自动安全更新机制
- 网络隔离(IoT VLAN)
- 流量异常检测
- 设备行为基线建模
相关阅读
- https://plumephp.com/security-cryptography/ — 现代密码学与数据加密
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。