Files
archived-doc-pt-br/faq/passwords.xml
2025-09-01 12:12:50 -03:00

195 lines
7.5 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f012b2761819e0ab25ff8cf4bac6655cfbc6fcff Maintainer: ae Status: ready --><!-- CREDITS: danielsatiro, ae, leonardolara -->
<chapter xml:id="faq.passwords" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Gerando hash de senhas de forma segura</title>
<titleabbrev>Hash de senhas</titleabbrev>
<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.
</simpara>
<qandaset>
<qandaentry xml:id="faq.passwords.hashing">
<question>
<simpara>
Por que deve ser feito hash das senhas fornecidas pelos usuários?
</simpara>
</question>
<answer>
<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.
</simpara>
<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.
</simpara>
<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.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.fasthash">
<question>
<simpara>
Por que as funções comuns tais como <function>md5</function> e
<function>sha1</function> são inadequadas para senhas?
</simpara>
</question>
<answer>
<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 <quote>força bruta</quote> na saída desses algoritmos
para determinar a entrada original.
</simpara>
<simpara>
Por causa da rapidez com que um computador moderno pode <quote>reverter</quote> 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.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.bestpractice">
<question>
<simpara>
Como as senhas devem ter seus hashes gerados, se as funções de hash comuns
não são adequadas?
</simpara>
</question>
<answer>
<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.
</simpara>
<simpara>
O PHP fornece
<link linkend="book.password">uma API de hash de senha nativo</link> que
lida de forma segura tanto <link linkend="function.password-hash">a geração de hash</link>
quanto a <link linkend="function.password-verify">verificação de senhas</link>
de forma segura.
</simpara>
<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.
</simpara>
<simpara>
A função <function>crypt</function> 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
<link linkend="book.password">API de hash de senha nativa</link>
sempre que possível.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.passwords.salt">
<question>
<simpara>
O que é um salt?
</simpara>
</question>
<answer>
<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.
</simpara>
<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.
</simpara>
<simpara>
<function>password_hash</function> criará um salt aleatório se um não
for fornecido, e esta geralmente é a abordagem mais fácil e mais
segura.
</simpara>
</answer>
</qandaentry>
<qandaentry xml:id="faq.password.storing-salts">
<question>
<simpara>
Como os salts são armazenados?
</simpara>
</question>
<answer>
<simpara>
Ao usar <function>password_hash</function> ou
<function>crypt</function>, 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
<function>password_verify</function> ao verificar senhas.
</simpara>
<warning>
<simpara>
<function>password_verify</function> deve sempre ser usada ao invés
se gerar novamente o hash e comparar o resultado a um hash armazenado para
evitar ataques de temporização.
</simpara>
</warning>
<simpara>
O diagrama a seguir mostra o formato de um valor de retorno de
<function>crypt</function> ou <function>password_hash</function>. 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.
</simpara>
<para>
<mediaobject>
<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.
</alt>
<imageobject>
<imagedata fileref="en/faq/figures/crypt-text-rendered.svg" width="690" depth="192" format="SVG" />
</imageobject>
</mediaobject>
</para>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->