Security & Keychain
Armazenamento seguro, cert pinning e ATS
Dados sensíveis (tokens, chaves API, credenciais) nunca devem ser armazenados em UserDefaults ou no filesystem. O Keychain Services é o único mecanismo aprovado pela Apple para armazenamento seguro em iOS.
Keychain Accessibility Options
O atributo kSecAttrAccessible define quando o item do Keychain pode ser acessado. A escolha impacta segurança e disponibilidade.
| Constante | Disponível quando | Migra em backup? | Uso |
|---|---|---|---|
| kSecAttrAccessibleWhenUnlocked | Dispositivo desbloqueado | Sim | Dados gerais do app |
| kSecAttrAccessibleAfterFirstUnlock | Após primeiro desbloqueio | Sim | Background refresh, push notifications |
| kSecAttrAccessibleWhenUnlockedThisDeviceOnly | Desbloqueado, sem migração | Não | Tokens de sessão |
| kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly | Após primeiro desbloqueio, sem migração | Não | Recomendado para SDKs |
| kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly | Passcode ativo + desbloqueado | Não | Dados altamente sensíveis |
App Transport Security (ATS)
| Regra | Requisito | Exceção |
|---|---|---|
| HTTPS obrigatório | Todas as conexões devem usar HTTPS | NSAllowsArbitraryLoads (requer justificativa na App Review) |
| TLS 1.2+ | Mínimo TLS 1.2 com forward secrecy | NSExceptionMinimumTLSVersion por domínio |
| Certificado válido | Certificado assinado por CA confiável | Cert pinning pode ser mais restritivo |
| SHA-256+ | Certificado com hash SHA-256 ou superior | Não há exceção — SHA-1 não é aceito |
Qual a diferença entre Keychain e UserDefaults para armazenamento?
UserDefaults armazena em plist no filesystem — não é criptografado, qualquer processo com acesso ao sandbox pode ler. Keychain é criptografado pelo Secure Enclave, protegido por hardware, e sobrevive à desinstalação do app (a menos que use
ThisDeviceOnly). Nunca armazene tokens, senhas ou chaves em UserDefaults.