移动应用安全Skill mobile-security

这是一个专注于移动应用安全开发的技能工具包,提供iOS和Android平台下的全面安全解决方案。核心功能包括:OWASP MASVS合规性实现、敏感数据安全存储(Keychain/Keystore)、证书绑定(Certificate Pinning)、生物识别认证(Face ID/Touch ID/指纹)以及应用安全加固(越狱检测、代码混淆、防篡改)。适用于移动开发工程师、安全工程师进行应用安全审计、漏洞修复和安全功能开发。关键词:移动安全、OWASP MASVS、iOS安全、Android安全、证书绑定、生物识别认证、数据加密、安全存储、应用加固、安全合规。

移动开发 0 次安装 0 次浏览 更新于 2/25/2026

name: mobile-security description: 移动应用安全技能,用于实现OWASP MASVS合规性、安全存储、证书绑定、生物识别认证以及跨iOS和Android平台的安全加固。 allowed-tools: Read, Grep, Write, Bash, Edit, Glob, WebFetch

移动安全技能

为iOS和Android平台提供全面的移动应用安全实现,涵盖OWASP移动安全指南、安全存储、认证机制和安全加固。

概述

本技能提供实施移动安全最佳实践的能力,包括安全数据存储、网络安全、认证机制以及符合OWASP移动应用安全验证标准(MASVS)的合规性。

能力

安全存储实现

  • 为敏感数据配置iOS钥匙串服务
  • 为加密操作设置Android密钥库
  • 实现加密的SharedPreferences/UserDefaults
  • 管理安全密钥生成和存储
  • 处理安全凭据管理

证书绑定

  • 为iOS证书绑定实现TrustKit
  • 为Android配置OkHttp CertificatePinner
  • 设置网络安全配置(Android)
  • 配置应用传输安全(iOS)
  • 验证和轮换绑定的证书

生物识别认证

  • 为iOS实现Face ID和Touch ID
  • 为Android配置指纹/生物识别提示
  • 处理备用认证机制
  • 管理生物识别注册状态
  • 保护受生物识别保护的钥匙串/密钥库项目

安全加固

  • 实现越狱/root检测
  • 配置代码混淆(ProGuard/R8, Swiftshield)
  • 设置防篡改机制
  • 实现运行时完整性检查
  • 配置安全调试设置

OWASP MASVS合规性

  • 针对MASVS级别1和级别2进行审计
  • 生成合规性检查清单
  • 识别安全漏洞
  • 推荐修复策略
  • 记录安全控制措施

先决条件

iOS开发

# 用于证书绑定的TrustKit
pod 'TrustKit'

# 钥匙串包装器
pod 'KeychainAccess'

Android开发

// build.gradle
dependencies {
    implementation 'androidx.security:security-crypto:1.1.0-alpha06'
    implementation 'androidx.biometric:biometric:1.1.0'
}

安全工具

# OWASP移动安全测试指南工具
pip install objection
brew install frida-tools

使用模式

iOS钥匙串存储

import Security

class KeychainManager {
    static func save(key: String, data: Data) -> Bool {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key,
            kSecValueData as String: data,
            kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
        ]

        SecItemDelete(query as CFDictionary)
        let status = SecItemAdd(query as CFDictionary, nil)
        return status == errSecSuccess
    }

    static func load(key: String) -> Data? {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrAccount as String: key,
            kSecReturnData as String: true,
            kSecMatchLimit as String: kSecMatchLimitOne
        ]

        var result: AnyObject?
        let status = SecItemCopyMatching(query as CFDictionary, &result)
        return status == errSecSuccess ? result as? Data : nil
    }
}

Android EncryptedSharedPreferences

import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey

class SecureStorage(context: Context) {
    private val masterKey = MasterKey.Builder(context)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build()

    private val sharedPreferences = EncryptedSharedPreferences.create(
        context,
        "secure_prefs",
        masterKey,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )

    fun saveToken(token: String) {
        sharedPreferences.edit().putString("auth_token", token).apply()
    }

    fun getToken(): String? {
        return sharedPreferences.getString("auth_token", null)
    }
}

证书绑定(iOS - TrustKit)

import TrustKit

class NetworkSecurityManager {
    static func configurePinning() {
        let trustKitConfig: [String: Any] = [
            kTSKSwizzleNetworkDelegates: false,
            kTSKPinnedDomains: [
                "api.example.com": [
                    kTSKEnforcePinning: true,
                    kTSKIncludeSubdomains: true,
                    kTSKExpirationDate: "2027-01-01",
                    kTSKPublicKeyHashes: [
                        "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
                        "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
                    ]
                ]
            ]
        ]
        TrustKit.initSharedInstance(withConfiguration: trustKitConfig)
    }
}

证书绑定(Android - OkHttp)

import okhttp3.CertificatePinner
import okhttp3.OkHttpClient

val certificatePinner = CertificatePinner.Builder()
    .add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
    .add("api.example.com", "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=")
    .build()

val client = OkHttpClient.Builder()
    .certificatePinner(certificatePinner)
    .build()

生物识别认证(iOS)

import LocalAuthentication

class BiometricAuth {
    func authenticate(completion: @escaping (Bool, Error?) -> Void) {
        let context = LAContext()
        var error: NSError?

        if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
            context.evaluatePolicy(
                .deviceOwnerAuthenticationWithBiometrics,
                localizedReason: "验证身份以访问安全数据"
            ) { success, error in
                DispatchQueue.main.async {
                    completion(success, error)
                }
            }
        } else {
            completion(false, error)
        }
    }
}

生物识别认证(Android)

import androidx.biometric.BiometricPrompt
import androidx.fragment.app.FragmentActivity

class BiometricAuth(private val activity: FragmentActivity) {
    fun authenticate(onSuccess: () -> Unit, onError: (String) -> Unit) {
        val executor = ContextCompat.getMainExecutor(activity)

        val biometricPrompt = BiometricPrompt(activity, executor,
            object : BiometricPrompt.AuthenticationCallback() {
                override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                    onSuccess()
                }

                override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                    onError(errString.toString())
                }
            })

        val promptInfo = BiometricPrompt.PromptInfo.Builder()
            .setTitle("生物识别认证")
            .setSubtitle("验证身份以访问安全数据")
            .setNegativeButtonText("取消")
            .build()

        biometricPrompt.authenticate(promptInfo)
    }
}

与Babysitter SDK集成

任务定义示例

const mobileSecurityTask = defineTask({
  name: 'mobile-security-implementation',
  description: '实施移动安全控制',

  inputs: {
    platform: { type: 'string', required: true, enum: ['ios', 'android', 'both'] },
    securityLevel: { type: 'string', required: true, enum: ['L1', 'L2'] },
    features: { type: 'array', items: { type: 'string' } },
    projectPath: { type: 'string', required: true }
  },

  outputs: {
    implementedControls: { type: 'array' },
    complianceReport: { type: 'object' },
    securityAuditPath: { type: 'string' }
  },

  async run(inputs, taskCtx) {
    return {
      kind: 'skill',
      title: `为${inputs.platform}实施${inputs.securityLevel}安全级别`, // 翻译了标题
      skill: {
        name: 'mobile-security',
        context: {
          operation: 'implement_security',
          platform: inputs.platform,
          securityLevel: inputs.securityLevel,
          features: inputs.features,
          projectPath: inputs.projectPath
        }
      },
      io: {
        inputJsonPath: `tasks/${taskCtx.effectId}/input.json`,
        outputJsonPath: `tasks/${taskCtx.effectId}/result.json`
      }
    };
  }
});

MCP服务器集成

使用owasp-mobile-security-checker

{
  "mcpServers": {
    "owasp-mobile": {
      "command": "npx",
      "args": ["owasp-mobile-security-checker"],
      "env": {
        "PROJECT_PATH": "/path/to/mobile/project"
      }
    }
  }
}

可用的MCP工具

  • owasp_scan_ios - 扫描iOS项目的OWASP漏洞
  • owasp_scan_android - 扫描Android项目的OWASP漏洞
  • check_keychain_usage - 验证iOS钥匙串实现
  • check_keystore_usage - 验证Android密钥库实现
  • validate_certificate_pinning - 检查证书绑定配置
  • audit_biometric_auth - 审计生物识别认证实现

OWASP MASVS检查清单

存储(MASVS-STORAGE)

  • [ ] 敏感数据不以明文存储
  • [ ] 敏感数据不在应用日志中
  • [ ] 敏感数据不与第三方共享
  • [ ] 敏感输入的键盘缓存已禁用
  • [ ] 敏感数据的剪贴板已禁用
  • [ ] 敏感数据已从备份中排除

加密(MASVS-CRYPTO)

  • [ ] 使用强加密算法
  • [ ] 加密密钥得到妥善管理
  • [ ] 随机数生成安全
  • [ ] 没有使用已弃用的加密函数

认证(MASVS-AUTH)

  • [ ] 生物识别认证正确实现
  • [ ] 会话管理安全
  • [ ] 密码策略得到执行
  • [ ] 提供多因素认证

网络(MASVS-NETWORK)

  • [ ] 所有连接使用TLS
  • [ ] 实现证书绑定
  • [ ] 证书验证未被绕过
  • [ ] ATS/网络安全配置正确配置

平台(MASVS-PLATFORM)

  • [ ] WebView正确配置
  • [ ] 深度链接经过验证
  • [ ] IPC机制得到保护
  • [ ] 敏感屏幕防止截图

代码质量(MASVS-CODE)

  • [ ] 启用代码混淆
  • [ ] 发布版本中禁用调试
  • [ ] 实现Root/越狱检测
  • [ ] 实施防篡改措施

最佳实践

  1. 纵深防御:分层实施多种安全控制
  2. 默认安全:默认采用最安全的配置
  3. 最小权限:仅请求必要的权限
  4. 数据最小化:仅存储必要的敏感数据
  5. 定期审计:持续评估安全状况
  6. 密钥轮换:实施证书和密钥轮换计划

参考资料