Existe absolutamente um mecanismo para isso: HTTPS.
(Eu sei o que você está pensando - leia até o final do post antes de decidir que não é o que você quer!)
Primeiro, o HTTPS é meramente HTTP baseado em SSL, então ter uma compreensão profunda do SSL será benéfico.
Normalmente, as conexões SSL usadas na web estão relacionadas apenas à autenticação do servidor. No entanto, existe uma maneira que o servidor pode autenticar o cliente também sendo sua própria CA e emitindo um certificado para o cliente. Esse recurso foi incorporado ao protocolo SSL como uma etapa opcional no caso em que você deseja autenticação bidirecional (muito parecida com o que você está solicitando).
Aqui está uma imagem BROAD de como funciona:
- O cliente inicia uma conexão com o servidor solicitando seu certificado.
- O servidor responde enviando seu certificado de volta ao cliente. Uma parte opcional desta etapa é que o servidor também pode desafiar o cliente solicitando um certificado. A maioria dos sites não faz isso. É isso que você deseja ativar no seu site.
- O cliente autentica o certificado do servidor é válido usando a chave pública da CA para descriptografar o certificado (se os dados corresponderem, então sabe-se que o certificado tinha como proveniente da CA, pois a CA tem a chave privada para gerar certificados).
- O cliente envia uma chave simétrica ao servidor (criptografada usando uma chave pública no certificado do servidor). Se o servidor solicitou um certificado, o cliente também envia seu certificado para o servidor.
- O servidor autentica o cliente. Geralmente, isso ocorre pelo próprio servidor, assumindo a função de CA e determinando que o certificado realmente veio desse servidor. Esta etapa ocorre apenas se o servidor tiver desafiado o cliente.
- Usando a chave simétrica criptografada que o cliente enviou, o servidor determina qual será a chave simétrica e envia uma confirmação de volta ao cliente.
- Neste momento, o aperto de mão está concluído. Toda a correspondência adicional ocorre usando um algoritmo de criptografia de chave simétrica simples.
Agora vem a pergunta: Como o cliente obtém o certificado em primeiro lugar? Primeiro de tudo, você precisa de uma maneira segura de emitir um certificado. Você mencionou cartões inteligentes (o que pode ser bom. Um simples salto é bom também, desde que você tenha certeza de que não cairá nas mãos erradas). Se estamos falando de segurança ao nível da CIA, então não há uma resposta fácil (ou barata) de como distribuir o certificado - você terá que usar o seu próprio julgamento e fazer sua lição de casa.
Quando o usuário tiver o certificado, todos os principais sistemas operacionais terão mecanismos para instalar o certificado, de modo que o seu computador seja inteligente o suficiente para responder automaticamente com o certificado correto. Encontrar informações sobre como fazer isso não deve ser difícil (eu fiz isso antes e não me lembro de muitos problemas para encontrar informações sobre o assunto).
Infelizmente, lidei apenas com ser cliente ao trabalhar com isso, mas esses links (e qualquer outra coisa que apareça em uma pesquisa no Google por "Autenticação de cliente SSL") devem ajudá-lo:
Suponho que você já saiba que isso trará dores de cabeça para seus clientes, portanto, faça isso apenas se tiver 100% de certeza de que um login simples na Web com a criptografia HTTPS mais básica não é o que você deseja.
Boa sorte, e espero que isso ajude.