<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'Hash de senhas',
    2 => 'Gerando hash de senhas de forma segura',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.using.php',
    1 => 'Utilizando o PHP',
  ),
  'next' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP e HTML',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'faq/passwords.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.passwords" class="chapter">
  <h1 class="title">Gerando hash de senhas de forma segura</h1>

  

  <p class="simpara">
   Esta seção explica as razões por trás do uso de funções de hash
   para proteger senhas, bem como fazê-lo de forma eficaz.
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.passwords.hashing">
     
      Por que deve ser feito hash das senhas fornecidas pelos usu&aacute;rios?
     
    </a></li><li><a href="#faq.passwords.fasthash">
     
      Por que as fun&ccedil;&otilde;es de hash mais comuns tais como md5 e
      sha1 s&atilde;o inadequadas para senhas?
     
    </a></li><li><a href="#faq.passwords.bestpractice">
     
      Como as senhas devem ter seus hashes gerados, se as fun&ccedil;&otilde;es de hash comuns
      n&atilde;o s&atilde;o adequadas?
     
    </a></li><li><a href="#faq.passwords.salt">
     
      O que &eacute; um salt?
     
    </a></li><li><a href="#faq.password.storing-salts">
     
      Como os salts s&atilde;o armazenados?
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.passwords.hashing">
    <dt><strong>
     <p class="simpara">
      Por que deve ser feito hash das senhas fornecidas pelos usuários?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Gerar hash de senha é uma das considerações mais básicas de segurança que
      deve ser feita ao projetar qualquer aplicação ou serviço que aceite senhas
      dos usuários. Sem gerar hash, todas as senhas que são armazenadas
      podem ser roubadas se o armazenamento de dados for comprometido, e
      então imediatamente usadas para comprometer não só a aplicação ou serviço, mas também
      as contas dos usuários em outros serviços, se eles não usarem
      senhas únicas.
     </p>
     <p class="simpara">
      Pela aplicação de um algoritmo de hash para as senhas dos usuários antes de
      armazená-las, torna-se implausível para um atacante
      determinar a senha original, enquanto ainda é possível comparar
      o hash resultante com a senha original no futuro.
     </p>
     <p class="simpara">
      É importante observar, entretanto, que hash de senhas só as protegem
      de serem comprometidas no armazenamento de dados, mas não necessariamente
      as protegem de serem interceptadas por código malicioso injetado na aplicação
      ou serviço em si.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.fasthash">
    <dt><strong>
     <p class="simpara">
      Por que as funções de hash mais comuns tais como <span class="function"><a href="function.md5.php" class="function">md5()</a></span> e
      <span class="function"><a href="function.sha1.php" class="function">sha1()</a></span> são inadequadas para senhas?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Algoritmos de hash como MD5, SHA1 e SHA256 são projetados para serem
      muito rápidos e eficientes. Com técnicas e equipamentos de computação modernos,
      tornou-se trivial usar <q class="quote">força bruta</q> na saída desses algoritmos
      para determinar a entrada original.
     </p>
     <p class="simpara">
      Por causa da rapidez com que um computador moderno pode <q class="quote">reverter</q> esses
      algoritmos de hash, muitos profissionais de segurança da informação sugerem fortemente
      que esses algoritmos não sejam utilizados para hash de senhas.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.bestpractice">
    <dt><strong>
     <p class="simpara">
      Como as senhas devem ter seus hashes gerados, se as funções de hash comuns
      não são adequadas?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Ao gerar hash de senhas, as duas considerações mais importantes são o
      custo do cálculo e o salt. Quanto mais custoso computacionalmente for
      o algoritmo de hash, maior será o tempo para usar força bruta na sua
      saída.
     </p>
     <p class="simpara">
      O PHP fornece
      <a href="book.password.php" class="link">uma API de hash de senha nativo</a> que
      lida de forma segura tanto <a href="function.password-hash.php" class="link">a geração de hash</a>
      quanto a <a href="function.password-verify.php" class="link">verificação de senhas</a>
      de forma segura.
     </p>
     <p class="simpara">
      O algoritmo sugerido para uso na geração de hash de senhas é o Blowfish, que
      também é o padrão usado pela API de hash da senha, pois é
      significativamente mais custoso computacionalmente que o MD5 ou que o SHA1, e ainda
      assim é escalável.
     </p>
     <p class="simpara">
      A função <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> também está disponível para hash
      de senhas, mas ela só é recomendada para interoperabilidade com outros
      sistemas.
      No lugar dela, é fortemente encorajado o uso da
      <a href="book.password.php" class="link">API de hash de senha nativa</a>
      sempre que possível.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.passwords.salt">
    <dt><strong>
     <p class="simpara">
      O que é um salt?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Um salt de criptografia são dados que são aplicados durante o processo de hash
      para eliminar a possibilidade da saída ser pesquisada
      em uma lista de pares de hashes pré-calculados e suas entradas, conhecida como
      tabela arco-íris.
     </p>
     <p class="simpara">
      Em termos mais simples, um salt é uma pequena adição de dados, que faz com que
      os hashes sejam significativamente mais difíceis de serem decifrados. Há uma série de
      serviços na internet que fornecem listas extensas de hashes pré-computados, bem
      como a entrada original para esses hashes. O uso de um salt faz com que seja
      improvável ou impossível encontrar o hash resultante em uma destas
      listas.
     </p>
     <p class="simpara">
      <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> criará um salt aleatório se um não
      for fornecido, e esta geralmente é a abordagem mais fácil e mais
      segura.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.password.storing-salts">
    <dt><strong>
     <p class="simpara">
      Como os salts são armazenados?
     </p>
    </strong></dt>
    <dd class="answer">
     <p class="simpara">
      Ao usar <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> ou
      <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span>, o valor de retorno inclui o salt como parte
      do hash gerado. Este valor deve ser armazenado na íntegra no
      banco de dados, uma vez que inclui informações sobre a função de hash que foi
      usada e pode, então, ser passado diretamente às funções
      <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> ao verificar senhas.
     </p>
     <div class="warning"><strong class="warning">Aviso</strong>
      <p class="simpara">
       <span class="function"><a href="function.password-verify.php" class="function">password_verify()</a></span> deve sempre ser usada ao invés
       de gerar novamente o hash e comparar o resultado a um hash armazenado para
       evitar ataques de temporização.
      </p>
     </div>
     <p class="simpara">
      O diagrama a seguir mostra o formato de um valor de retorno de
      <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> ou <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span>. Como pode
      ser visto, eles são auto-contidos, com todas as informações sobre
      o algoritmo e o salt necessárias para verificações futuras de senhas.
     </p>
     <p class="para">
      <div class="mediaobject">
       
       <div class="imageobject">
        <img src="images/2a34c7f2e658f6ae74f3869f2aa5886f-crypt-text-rendered.svg" alt="
        Os componentes do valor retornado pelas funções password_hash e crypt: em
        ordem, o algoritmo escolhido, as opções do algoritmo, o salt utilizado,
        e o hash da senha.
       " width="690" height="192" />
       </div>
      </div>
     </p>
    </dd>
   </dl>
  

 </div>
<?php manual_footer($setup); ?>