Login no Administrator do ColdFusion 7

Eu fiquei contente com o login no ColdFusion Administrator da nova versão do ColdFusion.

Na versão anterior, o sistema de login, criptografia e armazenamento da senha era muito precário. Foi só eu comentar com o Alex que ele fez um post, inclusive criticando (com razão) o sistema de login.

Na versão anterior (MX 6 e 6.1) havia um formulário de login onde era necessário digitar somente a senha. Embora o ideal seria algo como usuário-senha, é algo contornável (e extremamente recomendado, basta ler os posts sobre segurança aqui do CFGIGOLÔ) protegendo a pasta CFIDE/Administrator com um usuário e senha via web server.

A senha era enviada por padrão em formato plain-text, passível de spoof. Acessar o CF Administrator via https é algo que poucas vezes vi.

No servidor a senha então era encriptada com uma função (de encriptação de duas vias – encripta e desencripta) do próprio ColdFusion (Encrypt()), e comparada com a versão encriptada em um arquivo guardado em texto puro no servidor. Se o arquivo é em texto, e a criptografia é de duas mãos, é possível desencriptar a senha…

Era um sistema que funcionava, e bem até; mas não era seguro o suficiente para os paranóicos conscientes.

Na nova versão – anteriormente conhecida como Blackstone, na tela de login, ao digitar a senha, uma função JavaScript (no cliente portanto) encripta a senha utilizando SHA-1 (de mão única), criptografa a senha já encriptada (sim, de novo) utilizando uma key (agora em duas mãos) randômica (do tipo 1108059832081) e aí sim envia para o servidor, que se encarrega de verificar se a senha está correta. Ele recebe a senha criptografada duas vezes e a chave de uma delas; ele desencripta utilizando a chave e o resultado é a senha criptografada em SHA-1, que é comparada com a do arquivo password.properties.

Update: Um senão desse novo sistema é que há uma função interna (getAdminHash()) que retorna a senha hash (em criptografia SHA-1) do Administrator; a mesma senha que está no password.properties. Se alguém realmente quiser descobrir a senha, pode deixar um brute-force rodando até descobrir a senha. Vale dizer que para acessar essa função a dupla cfobject/createObject() entra em ação.