Login Site: como deve credenciais do usuário ser enviado para o servidor para verificação?




Eu estou trabalhando em um projeto no qual os clientes remotos precisa fazer login para um servidor web. Eu não estou olhando para exemplos em qualquer língua particular; apenas uma ideia geral dos problemas de segurança envolvidos.


A questão básica é:   

**Como devem as credenciais do usuário ser passados para um servidor web para verificação?**


Eu estou imaginando o seu login típico website. Um campo para o nome de usuário e outra para senha. Você digita em ambos e clique em Entrar. O que acontece depois?


Posso imaginar alguns cenários:


1. As credenciais são enviadas para o servidor como texto simples. Um script do lado do servidor cria um hash da senha e compara com o hash armazenado para o usuário.
2. As credenciais são criptografadas localmente, eo resultado é enviado para o servidor. O servidor decifra as credenciais e continua como em # 1
3. Algo que eu não tenha pensado ainda? Eu sou novo para isso. Vai com calma comigo!


Opção # 1 me parece fraco porque as credenciais são enviadas através da Internet em texto simples.


Eu vejo a opção # 2 como não muito melhor do que a opção # 1. Se alguém interceptar as credenciais criptografadas, pode não apenas enviar os para o servidor outra vez, e ainda conseguem entrar no fórum?


Qualquer visão é apreciado.


**edit:** o quadro relacionadas sugere [esta pergunta](https://stackoverflow.com/questions/610229/login-protocol) , que menciona um aperto de mão cliente / servidor com um sal adicionado à senha. É esse o caminho certo a seguir?
Opção 1 é de longe o padrão. A fraqueza texto simples geralmente é superado pela aplicação SSL durante o login para que a senha é, pelo menos criptografados durante o trânsito.


**Edit:** Eu sugiro que você siga a resposta aceitos para essa pergunta.


Não se esqueça de exigir um [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce) para o seu pedido. Isso ajudará a protegê-lo contra ataques de repetição.


**Editar o segundo:** Wayne cuidadosamente mencionou que você deve [sal](https://stackoverflow.com/questions/674904/salting-your-password-best-practices) sua senha antes de hash. Aqui estão algumas dicas básicas:


1. Não importa se o seu sal é um prefixo, postfix, ou infix
2. Seu sal deve ser grande, aleatório, e complexo.
3. Seu sal deve ser único por valor salgada. O sal em si não precisa ser criptografados.
acredito que ele esteja falando o seguinte, o ssh é um protocolo de rede que serve para “acessar” de forma “segura” uma maquina.

porém existe o ssh- client e ssh-sever, no caso ele disse para instalar o ssh-server, que tem como função “servir” um acesso ssh (e não vem instalado por padrão).

já o s… <p>o que os sites devem fazer é usar o twitters oauth para fazer login, ele o redirecionará para o twitter, onde será perguntado se você deseja compartilhar detalhes (nunca sua senha). sites externos em breve não poderão mais conectar usuários ao twitter usando um nome de usuário e senha, de modo que comportamentos como esse em breve seguirão o caminho do dodo.</p><p>para vê-lo em ação, criei um site para a api de aplicativos de pilha que usa o twitter oauth chamado <a href="http://stackoftwits.com">pilha de twits</a> .</p> nevermind… 
ao fim de uma semana de volta disto, lembrei-me de utilizar ’ para o username e password, e ja funcionou… 
bem se alguém passar pelo mesmo, o que têm de fazer é: 
server: ‘mqtt://localhost:1883’ 
user: ‘user’ 
password: ‘password’ Olá
  

  
Se você não esqueceu a senha e não tem problema de abertura de página, entre na página de login do serviço de seu e-mail (Gmail, Yahoo e Outlook, por exemplo) e, nos campos apropriados, digite o endereço de e-mail e a senha com os quais foi criada a conta. Isto deve responder onde e como, não é? Isto quer dizer, tudo é feito na página de login do serviço de e-mail em questão. Agora, quando você pode acessar? Sempre que quiser, contanto que tenha internet. <p>você deve analisar a solicitação de assinatura. um ótimo exemplo é <a href="http://docs.amazonwebservices.com/amazons3/latest/dev/restauthentication.html">amazon s3 rest)</a> .</p><p>a visão geral é bastante direta. o usuário possui duas informações importantes para usar sua api, um id de usuário público e uma chave de api privada. eles enviam o id público com a solicitação e usam a chave privada para assinar a solicitação. o servidor de recebimento consulta a chave do usuário e decide se a solicitação assinada é válida. o fluxo é algo como isto:</p><ol> <li>o usuário ingressa no seu serviço e obtém um id do usuário (por exemplo, 123) e uma chave de api.</li> <li>o usuário deseja fazer uma solicitação ao seu serviço de api para atualizar o endereço de e-mail. portanto, é necessário enviar uma solicitação para sua api, talvez para <code>/user/update?email=new@example.com</code>.</li> <li>para possibilitar a verificação da solicitação, o usuário adiciona o id do usuário e uma assinatura <strong> </strong> à chamada, para que a chamada se torne <code>/user/update?email=new@example.com&amp;userid=123&amp;sig=some\_generated\_string</code></li> <li>o servidor recebe a chamada, vê que é de userid = 123 e procura a chave da api para esse usuário. em seguida, replica as etapas para criar a assinatura a partir dos dados e, se a assinatura corresponder, a solicitação será válida.</li> </ol><p>essa metodologia garante que a chave da api <strong> nunca seja enviada como parte da comunicação </strong>.</p><p>dê uma olhada na função <a href="http://php.net/hash\_hmac">hash\_hmac ()</a> do php, que é popular para enviar solicitações assinadas. geralmente, você faz com que o usuário faça algo como colocar todos os parâmetros em uma matriz, classificar em ordem alfabética, concatenar em uma string e depois <code>hash\_hmac</code> essa string para obter o sig. neste exemplo, você pode fazer:</p><pre><code>$sig = hash\_hmac("sha256",$params['email'].$params['userid'],$api\_key) </code></pre><p>adicione então <code>$sig</code> no url rest como mencionado acima.</p> <p><strong>simplesmente</strong></p><ol> <li>criptografar sua pasta pessoal não torna o seu computador mais seguro - simplesmente torna todos os arquivos e pastas em sua pasta pessoal mais seguros contra visualização não autorizada. <ul> <li>seu computador ainda está "vulnerável" do ponto de vista da segurança - mas é muito difícil que seu conteúdo seja roubado (a menos que o invasor tenha sua senha).</li> </ul> </li> <li>você não precisará digitar sua senha mais do que normalmente faz - quando você faz o login no seu computador, seus arquivos são descriptografados sem problemas apenas para a sua sessão.</li> <li>existe a possibilidade (dependendo do hardware do seu computador) de afetar o desempenho da sua máquina. se você está preocupado com o desempenho mais do que com a segurança (e você está em uma máquina mais antiga), talvez queira desativar esse recurso.</li> </ol><p><strong>tecnicamente</strong></p><p>o ubuntu usa "ecryptfs", que armazena todos os dados em um diretório (neste caso, as pastas base) como dados criptografados. quando um usuário está logado, a pasta criptografada é montada com a segunda montagem descriptografada (essa é uma montagem temporária que funciona de maneira semelhante à tmpfs - é criada e executada em ram, portanto, os arquivos nunca são armazenados em um estado descriptografado o hd). a idéia é - se seu disco rígido for roubado eo conteúdo ler esses itens não puderem ser lidos, já que o linux precisa estar executando com sua autenticação para criar a montagem e descriptografia bem-sucedidas (as chaves são baseadas em dados criptografados sha-512). vários aspectos do usuário - as chaves são armazenadas em seu anel de chaves criptografadas). o resultado final é dados tecnicamente seguros (contanto que sua senha não seja quebrada ou vazada).</p><p>você não precisará digitar sua senha mais do que o habitual. há um ligeiro aumento de e/s de disco e cpu que (dependendo das especificações do seu computador) podem prejudicar o desempenho - embora seja bastante simples na maioria dos pcs modernos.</p> <p>a substituição do controle de um usuário pelo computador sempre será uma interrupção e, muitas vezes, será percebida como uma invasão do fluxo de trabalho desse usuário. o site "não deveria" ter o controle de nossos computadores, portanto, exercer esse controle será pelo menos um pouco alarmante.</p><p>dito isso, você aborda um tópico realmente importante, sendo a importância de informar ao usuário que sua entrada é inválida antes de preencher um conjunto inteiro de campos e enviá-los.</p><p>a abordagem que eu achei menos intrusiva, mas que fornece a resposta mais rápida, é o fluxo abaixo.</p><p><img src="https://i.stack.imgur.com/vxahu.png" alt="alt text"></p><p>essencialmente, espere que eles preencham seu primeiro campo e, à medida que clicam/separam um novo campo (ou um campo que foi invalidado), verifique o campo que acabou de ser concluído. se o campo que acabou de ser preenchido for válido, imprima um ícone "bom" discreto ao lado dele (verde, marca de seleção, sorriso no rosto, você entendeu). se falhar nas regras de validação, imprima discretamente um ícone "ruim" (vermelho, "x" etc.) e uma linha curta sobre o que falhou.</p><p>mas lembre-se, não interrompa o fluxo de trabalho:</p><ul> <li>sem pop-ups</li> <li>sem sobreposições</li> </ul><p>quando terminarem o campo para o qual foram movidos, eles voltarão ao campo inválido ou seguirão em frente e voltarão mais tarde. de qualquer forma, eles verão que têm uma edição para fazer, mas podem fazê-lo em seu próprio tempo.</p><p>no final, eles terão um formulário completamente válido antes de enviá-lo, o que significa</p><ol> <li>eles só terão que enviar uma vez</li> <li>eles não perdem tempo ficando bravos ou frustrados quando a submissão "falha"</li> <li>eles vão gostar mais do seu site</li> <li>todo mundo vai ter bolo</li> </ol> <p>olá fabio! pelo que entendi tem uma propriedade chamada <code>acceptsslscerts</code> que ao setar como true deveria ajudá-lo nesse cenário. inicialmente parece funcionar para todos os browser mas não é certeza então dependendo do browser que esteja utilizando talvez tenha que utilizar uma propriedade diferente para configurar. </p>
<p>nesse <a href="https://stackoverflow.com/questions/24507078/how-to-deal-with-certificates-using-selenium" rel="nofollow">link</a> tem mais detalhes como exemplo. faz sentido?</p> Oi
  

  
Na página de login do serviço de e-mail que usa digite seu endereço de e-mail e sua senha. Esqueceu a senha: redefina-a. 
  

  
Agora, se for a mensagem(e-mail) que não consegue abrir, limpe o cache de seu navegador e tente novamente. <p>nos arquivos de perfil do shell de login, você pode configurar algumas coisas que você usará durante a sessão e que precisam ser feitas apenas uma vez. algumas ideias:</p><ul> <li>crie um arquivo temporário contendo o endereço ip do qual você se conectou; posteriormente, você pode incluí-lo em alguns scripts que definem regras de firewall.</li> <li>execute ssh-agent, solicite suas chaves ssh e armazene as variáveis ​​de ambiente do agente ssh em um arquivo.</li> <li>se essa é uma máquina limitada e seus colegas de trabalho desejam conhecer os logins uns dos outros, escreva (1) mensagens informando sobre seu login.</li> </ul><p>nos arquivos do shell que não são de login (<code>.bashrc</code>) você deve configurar seu shell:</p><ul> <li>prompt extravagante</li> <li>definir aliases</li> <li>definir opções de histórico</li> <li>definir funções personalizadas do shell</li> <li>exportar variáveis ​​de ambiente (talvez pager, editor se as configurações do sistema forem ruins)</li> <li>carregar variáveis ​​ssh-agent salvas em <code>.bash\_profile</code></li> </ul><p>normalmente, você incluiria <code>.bashrc</code> de <code>.bash\_profile</code> com o seguinte. em seguida, faça login no shell recebe todas as suas personalizações e <code>.bash\_profile</code> o arquivo não precisa duplicar coisas que já estão em <code>.bashrc</code>.</p><pre><code>[[ -f ~/.bashrc ]] &amp;&amp; . ~/.bashrc </code></pre>