Controle de Acesso ao Keychain
Proteja itens com biometria e desbloqueio do dispositivo.
Controle de Acesso ao Keychain é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.
Controlando quando os segredos podem ser lidos
Armazenar um segredo é apenas metade do trabalho — você também precisa controlar quando ele pode ser lido. O chaveiro oferece classes de acessibilidade e flags de controle de acesso que protegem os itens por meio do desbloqueio do dispositivo, do código de acesso ou da biometria. Isso protege os dados caso o dispositivo seja perdido.
import Security
// Two layers of control:
// kSecAttrAccessible -> when readable (lock state)
// SecAccessControl -> user presence / biometricsA chave kSecAttrAccessible
kSecAttrAccessible define a classe de acessibilidade durante a adição. Ela determina se um item estará sempre disponível, somente após o primeiro desbloqueio ou apenas enquanto o dispositivo estiver desbloqueado. Escolha o nível mais rigoroso permitido pelo recurso.
import Security
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "user",
kSecValueData as String: Data("secret".utf8),
kSecAttrAccessible as String:
kSecAttrAccessibleWhenUnlocked
]
_ = queryWhenUnlocked
kSecAttrAccessibleWhenUnlocked torna o item legível somente enquanto o dispositivo está desbloqueado. Tarefas em segundo plano executadas enquanto o dispositivo está bloqueado não conseguem acessá-lo. Essa é a opção padrão adequada para a maioria dos tokens de sessão.
import Security
// Readable only while unlocked; blocked when locked.
let level = kSecAttrAccessibleWhenUnlocked
_ = levelAfterFirstUnlock
kSecAttrAccessibleAfterFirstUnlock mantém o item legível desde o primeiro desbloqueio após a inicialização até a próxima reinicialização — mesmo quando o dispositivo é bloqueado depois disso. Use essa opção para segredos necessários a um processo em segundo plano, como um token para lidar com notificações push.
import Security
// Available after the first unlock post-boot,
// including while subsequently locked.
let level = kSecAttrAccessibleAfterFirstUnlock
_ = levelVariantes ThisDeviceOnly
Cada classe de acessibilidade tem uma versão ...ThisDeviceOnly. Esses itens são excluídos dos backups criptografados e nunca são migrados para um novo dispositivo. Use essas versões para chaves que nunca devem sair deste hardware.
import Security
// Never backed up, never migrated:
let local = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
_ = localQuando há um código de acesso
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly armazena o item somente se o usuário tiver um código de acesso e o exclui se o código for removido. Isso garante que o segredo esteja sempre protegido por código de acesso.
import Security
let level =
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
// Item vanishes if the user disables their passcode.
_ = levelSecAccessControl para presença do usuário
Além do estado de bloqueio, SecAccessControlCreateWithFlags cria uma política que exige autenticação ativa do usuário — por biometria ou código de acesso — no momento da leitura. Você a associa por meio de kSecAttrAccessControl, em vez da chave de acessibilidade ou junto com ela.
import Security
func makeControl() -> SecAccessControl? {
return SecAccessControlCreateWithFlags(
nil,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
.userPresence,
nil)
}Flags de controle de acesso
Os flags refinam o requisito: .userPresence permite biometria ou uma alternativa com código de acesso; .biometryCurrentSet invalida o item se as impressões digitais ou os rostos cadastrados mudarem; .devicePasscode força a inserção do código de acesso. Combine-os para expressar suas necessidades de segurança.
import Security
// .userPresence -> biometric OR passcode
// .biometryAny -> any enrolled biometric
// .biometryCurrentSet -> invalidate on biometric change
// .devicePasscode -> passcode only
let flags: SecAccessControlCreateFlags = [.userPresence]
_ = flagsAdicionando um item protegido
Para armazenar um segredo protegido por biometria, coloque o objeto SecAccessControl em kSecAttrAccessControl. Qualquer leitura posterior solicitará que o usuário se autentique antes que os dados sejam retornados.
import Security
func saveProtected(_ data: Data, account: String,
control: SecAccessControl) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecValueData as String: data,
kSecAttrAccessControl as String: control]
return SecItemAdd(query as CFDictionary, nil)
== errSecSuccess
}A leitura solicita a autenticação do usuário
A leitura de um item protegido aciona automaticamente a interface de autenticação. Você pode fornecer uma string de motivo por meio de kSecUseOperationPrompt para que a solicitação explique por que o acesso é necessário. A leitura fica bloqueada até que o usuário se autentique ou cancele.
import Security
func readProtected(account: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecReturnData as String: true,
kSecUseOperationPrompt as String:
String(localized: "Unlock your saved key")]
var out: CFTypeRef?
return SecItemCopyMatching(query as CFDictionary,
&out) == errSecSuccess ? out as? Data : nil
}Escolhendo o nível adequado
Associe a política ao risco:
- Token de sessão usado em segundo plano:
AfterFirstUnlock. - Token usado apenas na interface:
WhenUnlocked. - Segredo de alto valor:
SecAccessControlcom.userPresencee uma classeThisDeviceOnly.
Uma proteção mais rigorosa é mais segura, mas impede o acesso em segundo plano — equilibre os dois aspectos.
import Security
// High-value: biometric-gated, device-bound, no backup
let control = SecAccessControlCreateWithFlags(
nil,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
.userPresence, nil)
_ = controlVerificação rápida
Relembre qual classe de acessibilidade é adequada para um segredo necessário em segundo plano.
Recapitulação
Você aprendeu a proteger itens do chaveiro:
kSecAttrAccessibledefine a disponibilidade conforme o estado de bloqueio:WhenUnlocked,AfterFirstUnlocke as variantes...ThisDeviceOnly, que não incluem os itens nos backups.WhenPasscodeSetThisDeviceOnlyvincula o item à existência de um código de acesso.SecAccessControlcom flags como.userPresenceou.biometryCurrentSetexige autenticação no momento da leitura.- Escolha o nível mais rigoroso que ainda permita o seu padrão de acesso.
Aprenda Swift com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 122
- Aulas
- 409
Perguntas Frequentes
A aula “Controle de Acesso ao Keychain” é grátis?
Sim — o texto completo de “Controle de Acesso ao Keychain” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.
O que vou aprender em “Controle de Acesso ao Keychain”?
Proteja itens com biometria e desbloqueio do dispositivo. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Controle de Acesso ao Keychain”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Armazenamento de Segredos no Keychain
- Controle de Acesso ao Keychain
- Autenticação biométrica
- Proteção e criptografia de dados