喂,你家炸了
还记得那个新闻吗?
“你家的摄像头平安吗?”--5元一个家用摄像头IP,对着卧室的10元,有羞羞画面的20元——本来用来监护家庭平安的家用摄像头可能让你的家变成直播间。据新华网报道,北京、浙江多地爆出家用摄像头隐衷危险,除了公开发售IP,甚至还有破解软件在QQ群中流传叫卖。
作为物联网的典型利用,智能家居的经典场景,摄像头的安全隐患,也隐隐揭示了物联网的平安危险。咱们先简略看看物联网常见的平安危险:
平安个性 | 设施/硬件侧 | 网络侧 | 云/服务器 |
---|---|---|---|
机密性 | 硬件攻打 | 低计算能力设施的加密 | 隐衷 |
完整性 | 不足证实,非法降级 | 低计算能力设施的签名 | NA |
可用性 | 物理攻击,无线阻塞 | 网络不牢靠 | NA |
认证 | 不足用户输出,硬件导出密钥 | 联结身份认证的挑战 | 不足设施辨认施行规范 |
访问控制 | 物理拜访,不足本地受权 | 访问控制的轻量协定 | 须要用户治理访问控制 |
不可抵赖性 | 没有平安的本地存储,低计算能力设施 | 低计算能力设施的签名 | NA |
黑客对物联网攻打的指标或是通过间接管制物联网设施达成,或是以物联网设施为跳板攻打其余设施或零碎。前一种状况能够参考后面新闻里说的摄像头IP,后者比方利用Mirai病毒管制互联网上的物联网设施形成僵尸网络。有些人更是能够通过剖析网络上物联网设施采集的信息发现秘密。
再分享一个物联网平安威逼地图:
<p align=center>(来自《物联网平安关键技术白皮书》)</p>
物联网平安防护(浅谈)
物联网的平安如何防护不用赘言,咱们间接来看如何防护。
1. 设施和网络安全
爱护物联网设施和网络的平安是确保整个物联网系统安全的要害。应该采取必要的措施来爱护物联网设施的物理平安、网络安全和应用程序平安。能够参考的根底步骤:
设施平安示例:
a. 应用平安启动(Secure Boot)技术来确保设施启动时不会被恶意软件(Malware)攻打。示例代码:
void secure_boot(void){ if (is_valid_boot_image(boot_image) && is_secure_boot(boot_image)) { boot_image(); } else { notify_security_team(); halt_system(); }}
b. 配置访问控制列表(Access Control List,ACL)以限度对设施的拜访。示例代码:
void configure_acl(void){ acl.add("admin", READ_WRITE); acl.add("user1", READ_ONLY); acl.add("user2", DENIED);}
网络安全代码示例:
a. 应用传输层平安(Transport Layer Security,TLS)协定来加密网络数据传输。示例代码:
void setup_tls(void){ SSL_CTX* ctx = SSL_CTX_new(TLS_method()); SSL_CTX_set_cipher_list(ctx, "ECDHE-ECDSA-AES256-GCM-SHA384"); SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, verify_callback); SSL_CTX_load_verify_locations(ctx, "ca.pem", nullptr); SSL* ssl = SSL_new(ctx); SSL_set_fd(ssl, socket_fd); SSL_connect(ssl); SSL_write(ssl, data, data_size); SSL_read(ssl, buffer, buffer_size); SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx);}
b. 应用网络防火墙(Network Firewall)技术来限度网络流量和阻止未经受权的拜访。示例代码:
void setup_firewall(void){ firewall.add_rule("allow", "192.168.0.0/24", "80", "TCP"); firewall.add_rule("deny", "any", "any", "any");}
根底的示例代码就是这样。然而具体利用还是须要依据物联网零碎和设施来抉择适合的平安计划和技术。
2. 数据加密
1) 对称密钥加密(Symmetric Key Encryption)示例代码:
对称密钥加密应用雷同的密钥加密和解密数据,实用于须要高效数据加密和解密的场景。
// 设置密钥和加密算法const char* key = "my-secret-key";const char* iv = "1234567890123456";const EVP_CIPHER* cipher = EVP_aes_256_cbc();// 加密数据int encrypt(unsigned char* plaintext, int plaintext_len, unsigned char* ciphertext, unsigned char* key, unsigned char* iv, const EVP_CIPHER* cipher){ EVP_CIPHER_CTX* ctx; int len; int ciphertext_len; ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, cipher, nullptr, key, iv); EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len); ciphertext_len = len; EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); ciphertext_len += len; EVP_CIPHER_CTX_free(ctx); return ciphertext_len;}// 解密数据int decrypt(unsigned char* ciphertext, int ciphertext_len, unsigned char* plaintext, unsigned char* key, unsigned char* iv, const EVP_CIPHER* cipher){ EVP_CIPHER_CTX* ctx; int len; int plaintext_len; ctx = EVP_CIPHER_CTX_new(); EVP_DecryptInit_ex(ctx, cipher, nullptr, key, iv); EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len); plaintext_len = len; EVP_DecryptFinal_ex(ctx, plaintext + len, &len); plaintext_len += len; EVP_CIPHER_CTX_free(ctx); return plaintext_len;}
2) 公钥加密(Public Key Encryption)示例代码:
公钥加密应用一对公钥和私钥进行加密和解密数据,实用于须要平安加密和解密的场景。
// 生成公钥和私钥RSA* generate_keypair(int bits){ RSA* keypair = RSA_new(); BIGNUM* exponent = BN_new(); BN_set_word(exponent, RSA_F4); RSA_generate_key_ex(keypair, bits, exponent, nullptr); BN_free(exponent); return keypair;}// 加密数据int encrypt(RSA* pubkey, unsigned char* plaintext, int plaintext_len, unsigned char* ciphertext){ int ciphertext_len = RSA_public_encrypt(plaintext_len, plaintext, ciphertext, pubkey, RSA_PKCS1_PADDING); return ciphertext_len;}// 解密数据int decrypt(RSA* privkey, unsigned char* ciphertext, int ciphertext_len, unsigned char* plaintext){ int plaintext_len = RSA_private_decrypt(ciphertext_len, ciphertext, plaintext, privkey, RSA_PKCS1_PADDING); return plaintext_len;}
以上的代码同样要依据物联网零碎和数据类型来抉择适合的加密形式。
3. 认证和受权
1) 用户名明码认证示例代码:
用户名明码认证是一种常见的认证形式,用于验证用户身份。
// 用户名和明码const char* username = "admin";const char* password = "password";// 认证函数bool authenticate(const char* input_username, const char* input_password){ // 查看用户名和明码是否匹配 if (strcmp(input_username, username) == 0 && strcmp(input_password, password) == 0) { return true; } return false;}
2) OAuth 2.0 受权示例代码:
OAuth 2.0 是一种常见的受权框架,用于容许用户受权第三方应用程序拜访他们的资源。
// OAuth 2.0 配置const char* client_id = "my-client-id";const char* client_secret = "my-client-secret";const char* redirect_uri = "https://example.com/callback";const char* authorization_endpoint = "https://example.com/authorize";const char* token_endpoint = "https://example.com/token";// 获取受权码const char* authorize(const char* scope){ // 构建受权申请 URL char url[256]; snprintf(url, sizeof(url), "%s?response_type=code&client_id=%s&redirect_uri=%s&scope=%s", authorization_endpoint, client_id, redirect_uri, scope); // 重定向用户到受权申请 URL redirect(url); // 接管受权码 const char* code = receive_code(); return code;}// 获取拜访令牌const char* get_access_token(const char* code){ // 构建拜访令牌申请 URL char url[256]; snprintf(url, sizeof(url), "%s?grant_type=authorization_code&code=%s&redirect_uri=%s&client_id=%s&client_secret=%s", token_endpoint, code, redirect_uri, client_id, client_secret); // 发送拜访令牌申请并接管响应 const char* response = send_request(url); // 解析拜访令牌 const char* access_token = parse_access_token(response); return access_token;}
4. 安全更新和破绽修复
1) OTA(Over-The-Air)更新示例代码:
OTA更新是一种常见的安全更新形式,容许通过无线网络近程更新设施的固件和软件。
// OTA 更新函数bool update_ota(const char* url, const char* version){ // 发送 OTA 更新申请 bool success = send_ota_request(url); if (success) { // 更新胜利后,保留最新的固件版本号 save_latest_version(version); } return success;}
2) 破绽修复示例代码:
破绽修复是一种常见的安全更新形式,用于修复发现的破绽和弱点。
// 破绽修复函数bool fix_vulnerability(const char* vulnerability){ // 确认破绽修复是否可行 bool feasible = check_vulnerability_feasibility(vulnerability); if (feasible) { // 修复破绽 fix_vulnerability(vulnerability); } return feasible;}
物联网的平安重要性
物联网的设施与互联网连贯并可能获取和传输敏感信息。这些设施包含智能家居设施、工业自动化零碎、医疗设施、汽车和无人机等。如果这些设施受到攻打或被未经受权的用户拜访,可能会导致各种重大的问题,如数据泄露、身份偷盗、服务中断、身材挫伤等。
毕竟,万物互联的根底还得是平安,不是吗?
业务平安产品:收费试用