Sei que a especificação do OAuth não especifica nada sobre a origem do código ConsumerKey, ConsumerSecret, AccessToken, RequestToken, TokenSecret ou Verifier, mas estou curioso para saber se há alguma prática recomendada para criar tokens significativamente seguros (especialmente Token / Combinações secretas).
A meu ver, existem algumas abordagens para criar os tokens:
- Basta usar bytes aleatórios, armazenar no banco de dados associado ao consumidor / usuário
- Faça hash de alguns dados específicos do usuário / consumidor, armazene no banco de dados associado ao consumidor / usuário
- Criptografar dados específicos do usuário / consumidor
As vantagens de (1) são o banco de dados ser a única fonte de informação que parece mais segura. Seria mais difícil executar um ataque contra (2) ou (3).
O hash dos dados reais (2) permitiria a regeneração do token a partir de dados presumivelmente já conhecidos. Pode não fornecer nenhuma vantagem para (1), já que precisaria armazenar / pesquisar de qualquer maneira. Mais uso da CPU do que (1).
Criptografar dados reais (3) permitiria descriptografar para saber as informações. Isso exigiria menos armazenamento e potencialmente menos pesquisas do que (1) e (2), mas potencialmente menos seguro também.
Existem outras abordagens / vantagens / desvantagens que devem ser consideradas?
EDITAR: outra consideração é que DEVE haver algum tipo de valor aleatório nos tokens, pois deve haver a capacidade de expirar e reemitir novos tokens, de modo que não deve ser composto apenas de dados reais.
Perguntas para Acompanhamento :
Existe um comprimento mínimo de token para tornar significativamente criptograficamente seguro? Pelo que entendi, segredos de token mais longos criariam assinaturas mais seguras. Este entendimento está correto?
Há vantagens em usar uma codificação específica em relação a outra de uma perspectiva de hashing? Por exemplo, vejo muitas APIs usando codificações hexadecimais (por exemplo, strings GUID). No algoritmo de assinatura OAuth, o Token é usado como uma string. Com uma string hexadecimal, o conjunto de caracteres disponível seria muito menor (mais previsível) do que, digamos, com uma codificação Base64. Parece-me que, para duas strings de comprimento igual, aquela com o conjunto de caracteres maior teria uma distribuição de hash melhor / mais ampla. Isso me parece que melhoraria a segurança. Esta suposição está correta?
A especificação OAuth levanta exatamente esse problema em 11.10 Entropia de Segredos .