Quanto custa uma palavra-passe num Raspberry Pi
As páginas de estatísticas podem aqui ser protegidas com uma palavra-passe. Calcular o resumo dessa palavra-passe é a única operação deste serviço que deve ser lenta — é isso que torna caro atacar um resumo roubado. A pergunta é quanto, neste equipamento.
Medido na máquina que faz correr este sítio, PHP 8.4.21 em aarch64:
PASSWORD_DEFAULT | 560 ms | (dá cost 12) |
| cost 12 | 595 ms | |
| cost 11 | 277 ms | |
| cost 10 | 138 ms |
O parâmetro de custo do bcrypt é um expoente: cada passo duplica o trabalho. As medições mostram exatamente essa duplicação, o que é bom sinal de que nada mais está a interferir.
Porque o valor por omissão é aqui a escolha errada
O PHP subiu o custo por omissão do bcrypt de 10 para 12. Num servidor de centro de dados é uma subida sensata — algumas dezenas de milissegundos. Numa pequena placa ARM são mais de meio segundo de processador puro, numa máquina que ao mesmo tempo está a desenhar imagens de contador para todos os outros.
Meio segundo por cada início de sessão já é mau por si só. É pior como convite: o ponto de entrada pode ser chamado por qualquer pessoa, e cada chamada consome 560 ms do único processador que serve o sítio inteiro. Isso faz da verificação da palavra-passe a forma mais barata de sobrecarga que existe aqui.
O custo está por isso fixado em 10 em vez de deixado ao valor por omissão. É deliberadamente mais fraco do que o que o PHP escolhe hoje, e isso deve ser dito com clareza em vez de enterrado: um resumo de custo 10 é quatro vezes mais barato de atacar do que um de custo 12. O que compensa isso é aquilo que a palavra-passe protege de facto — a visibilidade de uma página com números de visitas, não uma conta, não dinheiro, não uma identidade. Por detrás não há nada para tomar.
A parte que é fácil não ver
PASSWORD_DEFAULT é, por desenho, um valor móvel. Código escrito há anos que o use ficará silenciosamente mais lento a cada atualização do PHP — o mesmo código, a mesma entrada, um múltiplo do tempo de execução. É o comportamento previsto, e para a maior parte do software é o correto.
Só é errado quando a máquina não consegue absorvê-lo, e nada avisa quando não consegue. A atualização corre bem, os testes passam, a página continua a funcionar. Simplesmente demora meio segundo a mais, e ninguém olha para esse número se não for medi-lo.