Como o código se autentica numa tag protegida por senha?
Enviando o comando de autenticação do chip com a senha, conferindo a resposta do chip, e só então lendo ou gravando as páginas protegidas, tudo na mesma conexão. A autenticação dura no máximo enquanto a tag continua alimentada, então cada conexão nova começa sem ela. O comando em si pertence ao chip, não ao tipo de tag.
A sequência
Uma tag protegida por senha recusa as operações protegidas até receber a senha certa, nos chips que oferecem uma; o ajuste e o alcance dele estão cobertos na página da senha. O lado do código é uma sequência curta numa única conexão.
Ele conecta, com NfcA no Android ou por uma sessão de tag no iOS, e envia o comando de autenticação do chip com a senha, por transceive() ou sendMiFareCommand. Ele confere a resposta: na família NTAG21x, a senha de 32 bits vem com um valor de confirmação de 16 bits, PACK, segundo a ficha da NTAG213 no wakdev.com, e o código compara o valor que recebe com aquele que configurou. Só então ele lê ou grava as páginas protegidas, antes de fechar.
O comando não faz parte de nenhum tipo de tag. O código dele e o formato dele pertencem ao chip, e NTAG21x, MIFARE Ultralight C, ICODE SLIX e NTAG 424 DNA têm cada uma o seu; as fichas de chips do wakdev.com apontam para as fichas técnicas que os definem. Nos chips ISO/IEC 15693 que têm senhas, os comandos que as tratam ficam na faixa dos comandos próprios, como explica a página da ISO/IEC 15693.
O que termina a autenticação
Uma tag passiva tira a energia dela do campo do leitor, como explica a página da alimentação, e uma autenticação é um estado guardado no chip. Ela termina o mais tardar quando a tag sai do campo; a ficha técnica do chip diz que outros eventos a terminam.
Então uma nova tentativa começa do princípio. Depois de TagLostException no Android ou de readerTransceiveErrorTagConnectionLost no iOS, a tag que volta está sem autenticação, e o código que retoma pela gravação protegida recebe uma recusa. O mesmo vale para uma sessão de tag nova no iOS, e para o objeto Tag novo que o Android cria cada vez que a tag volta ao alcance.
Mantenha a autenticação e as operações que ela libera numa conexão e numa classe de tecnologia. Abrir outra classe pode fazer o Android selecionar a tag de novo: na pilha de código aberto, o código da conexão consegue fazer isso nas tags ISO-DEP e MIFARE Classic, quando a classe nova precisa de outra interface do controlador, e não faz nada numa tag Tipo 2. Se uma nova seleção termina a autenticação é a ficha técnica do chip que fixa, e a pilha de um fabricante de celulares pode decidir de outro jeito, então ficar numa classe só é a escolha que vale em todo celular.
Onde a senha vive
O código envia a senha, então ele tem de guardá-la. Uma senha única compilada dentro de um aplicativo está em toda cópia do aplicativo, e quem a extrair consegue regravar toda tag que ela protege. Uma senha por tag muda o problema para uma tabela que o aplicativo busca, aquilo que a página da senha chama de um banco de dados que você não pode perder.
Uma senha também é curta. A senha NTAG21x tem 32 bits, e algumas famílias de chip limitam as tentativas fracassadas, um ajuste que a página da senha recomenda habilitar onde ele existe.
Nada disso autentica a tag perante o aplicativo. Uma cópia do conteúdo não carrega senha alguma, como explica a página da senha contra a autenticação, então um aplicativo que precisa saber se uma tag é autêntica precisa de um chip que responda a um desafio criptográfico.
O que as API das plataformas não fazem
A API NDEF de nenhuma das plataformas recebe uma senha. Ndef.writeNdefMessage() no Android e writeNDEF no iOS gravam numa tag que aceita gravação, e numa tag protegida elas falham como qualquer gravação recusada, a falha que a página do erro de proteção descreve do lado do usuário.
O caminho confiável é autenticar com um comando bruto e gravar as páginas protegidas também com comandos brutos, o que quer dizer montar os bytes NDEF e gravá-los numa ordem segura, como descreve a página das gravações interrompidas. O Web NFC não oferece nenhum dos dois passos.
Perguntas frequentes
Ndef.writeNdefMessage consegue gravar numa tag protegida por senha?
Por si só não. As API NDEF não recebem senha, então autentique antes com um comando bruto e grave na mesma conexão, com comandos brutos para não correr risco.
Por que a minha gravação falha depois de uma nova tentativa?
A tag saiu do campo e voltou sem autenticação. Envie o comando de autenticação de novo antes das operações protegidas.
A senha protege o conteúdo contra a leitura?
Só nos chips e nos ajustes que protegem a leitura. A maioria das configurações protege apenas a gravação, como explica a página da senha.
Um aplicativo consegue manter a senha em segredo?
Não de quem a extrair do aplicativo. Todo aplicativo que autentica guarda a senha que envia, então trate-a como uma trava contra a regravação casual.