Aula 191: Usando os Serviços de Chaveiro
Os Serviços de Chaveiro são uma poderosa API fornecida pela Apple que permite aos desenvolvedores armazenar de forma segura pequenas quantidades de informações sensíveis, como senhas, chaves de criptografia e tokens. Nesta aula, exploraremos como usar os Serviços de Chaveiro em Swift para salvar e recuperar dados de forma segura.
O que é o Chaveiro?
O Chaveiro é uma solução de armazenamento seguro fornecida pela Apple que permite armazenar persistentemente dados sensíveis. Ele criptografa os dados em repouso e fornece controle de acesso, garantindo que apenas acessos autorizados sejam possíveis. O Chaveiro é ideal para situações em que você precisa armazenar de forma segura as credenciais dos usuários e outras informações sensíveis.
Importando o Framework de Segurança
Antes de podermos usar os serviços do Chaveiro, precisamos importar o framework de Segurança no nosso arquivo Swift:
import Security
Salvando Dados no Chaveiro
Para salvar dados no Chaveiro, precisamos criar um dicionário de consulta e usar a função SecItemAdd
. Veja um exemplo de como salvar uma senha no Chaveiro:
func savePassword(_ password: String, service: String, account: String) -> Bool {
let passwordData = password.data(using: .utf8)!
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: account,
kSecValueData as String: passwordData
]
SecItemDelete(query as CFDictionary) // Remove item existente
let status = SecItemAdd(query as CFDictionary, nil)
return status == errSecSuccess
}
Nesta função:
- Convertamos a senha em
Data
. - Criamos um dicionário de consulta com atributos relevantes para descrever o item que queremos salvar.
- Removemos qualquer item existente usando
SecItemDelete
antes de adicionar um novo para evitar conflitos. - Por fim, chamamos
SecItemAdd
para armazenar os dados no Chaveiro.
Recuperando Dados do Chaveiro
Para recuperar os dados, usaremos um dicionário de consulta semelhante e a função SecItemCopyMatching
. Veja como recuperar uma senha:
func retrievePassword(service: String, account: String) -> String? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: account,
kSecReturnData as String: kCFBooleanTrue!, // Queremos os dados retornados
kSecMatchLimit as String: kSecMatchLimitOne
]
var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
if status == errSecSuccess {
if let passwordData = item as? Data {
return String(data: passwordData, encoding: .utf8)
}
}
return nil // Retorna nil se a recuperação falhar
}
Nesta função:
- Configuramos uma consulta para especificar o que estamos procurando.
- Usamos
SecItemCopyMatching
para realmente recuperar o item do Chaveiro. - Se bem-sucedido, convertemos o
Data
resultante de volta em umaString
e a retornamos.
Deletando Dados do Chaveiro
Se você precisar deletar um item do Chaveiro, pode usar SecItemDelete
. Veja uma função para remover uma senha:
func deletePassword(service: String, account: String) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: account
]
let status = SecItemDelete(query as CFDictionary)
return status == errSecSuccess
}
Esta função constrói uma consulta para o item que você deseja deletar e chama SecItemDelete
.
Exemplo de Uso
Veja como você pode usar as funções acima juntas em sua aplicação:
let service = "com.example.myapp"
let account = "user@example.com"
let password = "senhaSegura123"
// Salvar uma senha
if savePassword(password, service: service, account: account) {
print("Senha salva com sucesso")
}
// Recuperar uma senha
if let retrievedPassword = retrievePassword(service: service, account: account) {
print("Senha recuperada: \(retrievedPassword)")
}
// Deletar uma senha
if deletePassword(service: service, account: account) {
print("Senha deletada com sucesso")
}
Conclusão
Nesta aula, cobrimos como usar os Serviços de Chaveiro em Swift para armazenar, recuperar e deletar informações sensíveis de forma segura. Essa abordagem é essencial para aplicações que requerem um tratamento seguro das credenciais dos usuários e outros dados sensíveis. Ao empregar os Serviços de Chaveiro, você pode garantir um nível mais alto de segurança em suas aplicações.