O que os programadores da web devem saber sobre criptografia? [fechadas]

27

Os programadores que constroem sites / aplicativos da web devem entender a criptografia? Não tenho idéia de como a maioria dos algoritmos criptográficos funciona e realmente não entendo as diferenças entre md5 / des / aes / etc. Algum de vocês encontrou alguma necessidade de uma compreensão aprofundada da criptografia?

Eu não precisava disso, mas me pergunto se talvez esteja perdendo alguma coisa. Eu usei o salt + md5 hash para criptografar senhas e digo aos servidores da Web para usar SSL. Além disso, não posso dizer que usei muito mais, nem posso dizer com certeza como esses métodos são seguros. Eu os uso apenas porque outras pessoas afirmam que são seguras.

Você já encontrou a necessidade de usar criptografia na programação da web além desses dois exemplos simples?

davidhaskins
fonte
4
Eles devem saber o suficiente para saber que não devem fazê-lo.
SLaks
@SLaks: +1 100% concorda. Eu escrevi uma resposta para este tópico para expandir o porquê disso.
22611 Chris Jester-Young

Respostas:

41

Os programadores da Web devem saber que nunca devem tentar implementar eles mesmos criptografia.

Em particular, isso significa que nenhum especialista em não segurança deve tocar diretamente em nenhuma das primitivas criptográficas. Eles não deveriam estar pensando no nível do AES, SHA-1, etc. Em vez disso, deveriam estar usando funções de alto nível para criptografar e assinar mensagens, além de senhas "hash".

Por quê? Porque, caso contrário, as pessoas se enganam ao pensar que:

  • O AES-256 é "ótima criptografia", apesar de estarem usando-o no modo BCE, ou usando valores IV não aleatórios etc. (Em alguns modos, IVs não aleatórios, mas únicos, são aceitáveis. muito.)
  • Eles podem usar a mesma chave simétrica para criptografar várias mensagens (ou pior, armazenar a chave simétrica no código para uso direto).
    • Eles podem até decidir usar uma senha como chave diretamente, sem usar nenhuma função de derivação de chave.
  • Eles podem usar o RSA para criptografar dados diretamente.
  • Eles podem simplesmente "saltar e MD5" suas senhas para mantê-las seguras. (Se você acha que as tabelas do arco-íris são o elo mais fraco, pense novamente .)

Apenas para estar na mesma página, nenhum dos itens acima está correto . Se você não conseguir isso, não deve tocar na criptografia com uma vara de 3 metros! (O AES-256 é uma ótima criptografia, mas somente se você o usar corretamente. "Não é o tamanho que importa, é o que você faz com ele." :-))

De que tipo de funções de alto nível estou falando? Eu, pessoalmente, recomendo o uso de uma biblioteca OpenPGP (para dados em repouso) ou SSL (para dados em movimento). Esses protocolos especificam rigidamente o uso correto de algoritmos assimétricos, simétricos e de hash. Por exemplo, com o OpenPGP:

  • Ele não usa o RSA para criptografar dados diretamente, mas gera uma chave de sessão aleatória (simétrica) por mensagem (isso é importante) e usa o RSA para criptografar essa chave de sessão.
  • Ele usa uma função de derivação de chave para transformar senhas em chaves. (No jargão do OpenPGP, é chamado de S2K, mas acho que "função de derivação de chave" é o termo mais padrão.)
  • Ele lida com a escolha de um bom modo, para que você nunca use o BCE.
  • Ele lida com o gerenciamento de chaves para você, para que você não precise tomar decisões ad-hoc sobre quais chaves são confiáveis ​​etc.

Resumo: se você não é um especialista em segurança e pensa no nível da AES, SHA-1 ou MD5, não está conseguindo , você está fazendo errado . Use uma biblioteca criada por especialistas em segurança (como o Bouncy Castle), que implementa protocolos projetados por especialistas em segurança (como o OpenPGP para criptografia ou bcrypt ou scrypt para hash de senha), em vez de usar o seu.

Eu não sou um especialista em criptografia de forma alguma, mas sei o suficiente para não tentar criar meus próprios protocolos ad-hoc. Só para esclarecer, todo este post é material da Cryptography 101 . Portanto, se este post não fizer 100% de sentido para você, você definitivamente não deve chegar nem perto da criptografia.

Chris Jester-Young
fonte
4
impressionante. adorei a postagem do blog vinculada ao "think again". chargen.matasano.com/chargen/2007/9/7/…
davidhaskins
+1, mas usar a mesma chave simétrica várias vezes é bom. É para isso que serve o IV (caso contrário, você não precisaria).
orip 5/09/12
1
Além disso, Colin Percival, da fama de scrypt (e de outras), possui um ótimo artigo chamado "Respostas corretas criptográficas", que define as decisões criptográficas que você precisa tomar sobre pão e manteiga. O SSL é muito problemático (a revogação de chave é muito difícil de implementar). Mais informações aqui: daemonology.net/blog/…
orip
@orip Concordo, embora eu diria que usar a mesma chave com um IV diferente geralmente é mais útil para o caso em que sua mensagem é maior que o tamanho do bloco da cifra simétrica escolhida, em vez de mensagens distintas, nas quais você não tem contexto para acompanhar os IVs usados ​​nas mensagens anteriores. Além disso, concorde com o artigo de Colin Percival.
Chris Jester-Young
1
@ Enjoy Eu mudei o link para algo mais relevante.
Chris Jester-Young
14

Você não precisa saber nada além dos princípios básicos sobre criptografia (o que é um hash, o que é um sal, aproximadamente o quão difícil é quebrar essa criptografia ou aquilo e assim por diante), mas você precisa saber um pouco sobre segurança em geral.

As principais áreas de segurança que você definitivamente precisa conhecer como desenvolvedor web:

  1. Injeção SQL. Este é provavelmente o buraco mais perigoso que um desenvolvedor da Web pode perfurar em um sistema.
  2. Scripts e cookies entre sites.
  3. Spambots e captchas.
  4. Injeção SQL. Não se pode enfatizar o suficiente como isso é importante.
biziclop
fonte
Não entender nada do que você está fazendo é muito perigoso. Não saber qual a diferença entre um hash de resumo da mensagem e um hash criptográfico pode arruiná-lo. Não saber salgar pode arruiná-lo.
Incognito
@ user1525 Foi o que eu quis dizer como o básico da criptografia. Definitivamente, você não precisa saber como realmente funciona qualquer um dos algoritmos de criptografia.
biziclop
Agradeço a resposta e concordo com a injeção de SQL e outros ataques, mas estava realmente perguntando sobre criptografia.
Davidhaskins
2
@davidhaskins Sim, eu apenas pensei que valia a pena destacar, porque cada nível se baseia no anterior. Saber como o AES funciona não vale nada se você não conseguir proteger seu aplicativo em um nível mais básico. Na minha experiência, essa é uma armadilha em que muitos desenvolvedores caem (eu fiz isso várias vezes), para me concentrar na criptografia e perder de vista seu papel na longa cadeia de segurança.
biziclop
4

Lembro-me de ver essa palestra chamada O que todo engenheiro precisa saber sobre segurança e onde aprender , o palestrante é Neil Daswani e é um Google Tech Talk que ele deu, pode ser um bom lugar para começar!

Porém, não se aplica apenas aos programadores da Web, talvez a pergunta deva ser re-intitulada "O que os programadores devem saber sobre segurança?" pois eles não precisam saber mais do que o básico sobre criptografia (por mais interessante que seja)


fonte
2

A criptografia é útil em muitas situações. Um exemplo que usamos é criptografar um cookie de sessão criado e definido por um host Win / IIS para ser usado em um host LAMP.

Para implementar a criptografia (em oposição ao hash md5 / sha1), alguns termos básicos são importantes - como a diferença entre criptografia simétrica e assimétrica. Além de entender a diferença entre os dois, você deve desenvolver um entendimento do que você, como desenvolvedor da web, precisa fazer para armazenar e proteger adequadamente as chaves de descriptografia. Por exemplo, se o desenvolvimento de um aplicativo a ser implantado em um host sobre o qual você não tem controle administrativo total, como um host compartilhado, é implantado em um servidor em que todos os administradores são conhecidos e confiáveis.

Michael
fonte
2

Na minha opinião, você deve saber tudo sobre criptografia que alguém que está atacando seu código saberá. Você deve entender hashes, salt, a não aleatoriedade do aleatório, os principais algoritmos de criptografia (RSA, 3DES, AES etc.), SHA-1 / MD-5 / et al. Você não precisa memorizá-los, mas pelo menos deve saber a eficácia de um algoritmo de hash e como torná-lo mais forte. Você deve saber o que são colisões e falsos positivos. Você não deve poder recitar os algoritmos de criptografia, mas deve estar familiarizado com os benchmarks deles, quais são ideais para quais cenários. Você deve ser capaz de descrever e explicar a criptografia simétrica x assimétrica e quando usar cada uma. Você deve saber o que é PKI e como é usado. Você deve saber o que é uma autoridade de certificação e como ela interage com seus servidores.

Conhecer os meandros de tudo não é tão importante quanto conhecer os antecedentes. Quais são os parâmetros de referência de certas coisas (quão rápido, quão forte, pontos fracos, etc.).

Essas recomendações são para informações de nível sênior ou arquiteto. Se você é apenas um macaco da web remando um remo, não precisa saber nada disso. Seu arquiteto deve conhecer essas coisas. Se você está no comando do site, projetando-o, implementando-o, etc ..., deve familiarizar-se com todos esses conceitos e conversar com inteligência sobre eles. Você não precisa ensiná-lo, basta aceitar e disseminar informações sobre ele.

Joel Etherton
fonte
2

Você deve usar o bcrypt (Blowfish) para armazenar senhas em vez do MD5; é um algoritmo muito mais lento , o que significa que é muito mais difícil para um hacker adivinhar e verificar. Além disso, o bcrypt usa um fator de trabalho como parâmetro, o que significa que pode ficar ainda mais lento à medida que os computadores mais novos são introduzidos, para que ele tenha embutido à prova de futuro.

Consulte Como armazenar uma senha com segurança para obter mais informações.

chrisaycock
fonte
0

Como uma resposta bastante geral a esse tipo de perguntas, sempre penso que você deve tentar ter um entendimento básico de qualquer coisa que esteja remotamente relacionada ao que você faz. É claro que você precisa de conhecimentos detalhados específicos sobre o que realmente está trabalhando. É muito difícil prever como uma determinada área evoluirá, o que estará "na moda" ou o que você precisará no futuro; portanto, manter uma ampla área de coisas das quais você pelo menos "ouviu falar" permanecerá muitas portas se abrem.

Quanto à minha experiência pessoal em programação na Web, achei noções básicas de criptografia assimétrica e essas coisas úteis para entender o que está acontecendo sob o capô. Eu poderia ter sobrevivido sem ele, mas devo dizer que gosto de criptografia e matemática; por que não?

Omar Kohl
fonte