mirror of
https://github.com/php/doc-pt_br.git
synced 2026-03-23 22:52:12 +01:00
195 lines
7.5 KiB
XML
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
|
|
-->
|