SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
01.12.2024

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 uma String 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.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!