• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kingless

MD5 Hash SEGURO!

126 mensagens neste tópico

Eu estou a desenvolver um CMS e eu tenho sempre muita preocupação com a segurança do CMS por isso eu criei uma função que encripta uma senha numa forma IMPOSSIVEL de se desencriptar e descobrir qual é a senha... para alguns a função pode parecer um bocadinho exagerada mais para mim a segurança está em primeiro lugar. (também criei esta função porque ja vi muitos topicos a falarem sobre a segurança da função md5() do php)

//kingless 2006
function Hash_Seguro( $senha ) {

$alfanum = array( '/a/i', '/b/i', '/c/i', '/d/i', '/e/', '/f/i', '/g/i', '/h/i', '/i/i',
                                  '/j/i', '/k/i', '/l/i', '/m/i', '/n/i', '/o/i', '/p/i', '/q/i', '/r/i',
                                  '/s/i', '/t/i', '/u/i', '/v/i', '/w/i', '/x/i', '/y/i', '/z/i', '/0/i',
                                   '/1/i', '/2/i', '/3/i', '/4/i', '/5/i', '/6/i', '/7/i', '/8/i', '/9/i' );

$Hash = array(  'ç', 'ß', 'æ', '?', 'º', '^', '»', 'µ', ';',
                             '¶', 'ø', 'þ', 'ð', '¢', 'n', '¬', '¹', '@',
                             '£', '§', '½', '{', '[', '`', '~', '_', '«',
                              '.','=', '}', '!', '|', '"', '#', '$', '%' );

$HashSeguro = md5( sha1( base64_encode( serialize( addslashes( preg_replace( $alfanum, $Hash, $senha ) ) ) ) ) );
return $HashSeguro;
}
 

Agora um exemplo sobre como utilizar a função

$senha = "minha_senha";

$senha = Hash_Seguro( $senha );

echo $senha;
 

Isso vai mostrar  f330c6bb1ba0c4a8cdedd6f4813fc9ce  parece uma senha md5 normal mas não é.... e é impossivel desencriptar.

Algumas pessoas vão querer saber como aplicar a função no login... aqui fica um pequeno exemplo

//Um exemplo da senha de um usuario que esteje na base de dados
$senha_db = "c3b97865860adedfbb461febc3b5bcba";

//Senha do formulario
$senha = $_POST['senha'];

if($senha_db ==  Hash_Seguro( $senha )) {

echo "Você fez o login com sucesso";

} else {

echo "A senha esta errada";

}
 

E é isso..  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

kingless, é possível esse teu algoritmo sofra do mesmo mal do MD5.

O problema não é a desencriptação mas sim o facto de ser possível, em tempo útil, encontrar pelo menos uma string cujo resultado codificado seja igual.

Seja como for, mesmo que esse problema exista, duvido que o mesmo seja realmente preocupante. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não te esqueças que não é apenas md5 mas sim sha1 que é impossivel desencriptar, o que os desencriptadores fazem é desencriptar a senha md5 para uma string e não para sha1 depois base64_encode e o resto... E por isso posso te garantir que é IMPOSSIVEL. Talvez não tenhas reparado bem no código, a função só da aquela md5 por causa do sha1, base6_encode, serialize, addslashes, preg_replace... não quer dizer que exista uma string com aquela md5 :( se por acaso existir vai ser desencriptada para uma string qualquer e muito distante da password verdadeira, Acho que não reparaste bem no código sabes o que é que o preg_replace faz ? Não existem duas md5 iguais...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas olga que a função não é assim tão eficiente quanto isso... a tua função no final de tudo vai ser uma hash md5 de um conjunto de caracteres, se alguem conseguir desincriptar isso, fica com a hash sha1. sha1 não é tão facil de desincriptar como md5 mas já li que era possivel, logo se o utilizador conseguir descobrir o valor da hash sha1, so lhe resta fazer o inverso das funções base64_encode, serialize e preg_replace, o que não custa mt pois existem funções para isso.

a minha conclusão, é que, uma função com apenas md5(sha1($senha)), vai dar quase ao mesmo, mas eu optava por sha1(md5($senha)), apesar de ser praticamente a mesma coisa.

claro que para quem não vir o codigo, pode pensar que é uma simples hash md5, tentar desincriptar e pensar que entra dps vai ter a surpresa de que n consegue porque a password não era aquela, mas quem tentar hackar o sistema, é obvio que vai olhar po codigo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não te esqueças que não é apenas md5 mas sim sha1 que é impossivel desencriptar, o que os desencriptadores fazem é desencriptar a senha md5 para uma string e não para sha1 depois base64_encode e o resto... E por isso posso te garantir que é IMPOSSIVEL.

Impossível? :) Isso foi exactamente o que o inventor do MD5/SHAx disse... Alguns anos mais tarde provou-se o contrário. :P

Talvez não tenhas reparado bem no código, a função só da aquela md5 por causa do sha1, base6_encode, serialize, addslashes, preg_replace... não quer dizer que exista uma string com aquela md5 :) se por acaso existir vai ser desencriptada para uma string qualquer e muito distante da password verdadeira, Acho que não reparaste bem no código sabes o que é que o preg_replace faz ? Não existem duas md5 iguais...

kingless, aplicar várias operações de encriptação de forma sequencia não garante mais segurança.

Repara que todas o md5 e o sha1 fazem uma geração de uma chave com um determinado tamanho. Ou seja, há mais de uma string que vai resultar exactamente nessa chave, daí o clashing, o grande problema do md5 e derivados (sha1).

Os ataques a este tipo de encriptação não se dão por tentiva de desencriptação mas sim pela procura de uma palavra cuja encriptação resulte na mesma chave, independentemente se essa chave é um simples md5 ou uma amalgama de md5(sha1(xpto( ... yptz('ola')... ))).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Em 8/2/2006 às 12:01, Nazgulled disse:

mas olga que a função não é assim tão eficiente quanto isso... a tua função no final de tudo vai ser uma hash md5 de um conjunto de caracteres, se alguem conseguir desincriptar isso, fica com a hash sha1. sha1 não é tão facil de desincriptar como md5 mas já li que era possivel, logo se o utilizador conseguir descobrir o valor da hash sha1, so lhe resta fazer o inverso das funções base64_encode, serialize e preg_replace, o que não custa mt pois existem funções para isso.

a minha conclusão, é que, uma função com apenas md5(sha1($senha)), vai dar quase ao mesmo, mas eu optava por sha1(md5($senha)), apesar de ser praticamente a mesma coisa.

claro que para quem não vir o codigo, pode pensar que é uma simples hash md5, tentar desincriptar e pensar que entra dps vai ter a surpresa de que n consegue porque a password não era aquela, mas quem tentar hackar o sistema, é obvio que vai olhar po codigo...

Sabes quantos caracteres tem sha1 ? sha1 tem 42 caracteres.  Sabes quantos caracteres tem md5 ? md5 tem 32 caracteres...  Sabes como os desencriptadores funcionam ? Os desencriptadores de md5 são palavras que os donos dos desencriptadores  encriptam e colocam na base de dados e quando alguem procurar por uma md5 se ela estiver na base de dados aquilo retorna a palavra da md5... Nenhum desencriptador desencripta a propria palavra...

Qual é a probilidade de uma CMS sem bugs e sem falhas de segurança ser atacado ? 1% Qual é a probalidade de alguem conseguir a senha e user da base de dados e conseguir retornar as senhas ? menos de 1%  Eu sei como é que se fazem esses ataques a base de dados e te digo que é  muito muito dificil conectar-se a base de dados e retornar a senhas md5 :P

Sabes como é que alguem ataca a base de dados de um servidor ? se não sabes nem vale a pena discutires este assunto.

Em 8/2/2006 às 14:58, M6 disse:
Em 8/2/2006 às 10:44, kingless disse:

Não te esqueças que não é apenas md5 mas sim sha1 que é impossivel desencriptar, o que os desencriptadores fazem é desencriptar a senha md5 para uma string e não para sha1 depois base64_encode e o resto... E por isso posso te garantir que é IMPOSSIVEL.

Impossível? :D Isso foi exactamente o que o inventor do MD5/SHAx disse... Alguns anos mais tarde provou-se o contrário. :)

NÂO É POSSIVEL SE DESENCRIPTAR MD5...  O acontece não se pode chamar desencriptar, o que estas a chamar de desencriptar são palavras adicionadas numa base dados  e quando alguem procura por uma md5 se a palavra dessa md5 existir na base de dados aquilo retorna a palavra... caso contrario não retorna nada. POR ISSO NÂO SE PODE CHAMAR DE DESENCRIPTAÇÃO.

Citação

kingless, aplicar várias operações de encriptação de forma sequencia não garante mais segurança.

Repara que todas o md5 e o sha1 fazem uma geração de uma chave com um determinado tamanho. Ou seja, há mais de uma string que vai resultar exactamente nessa chave, daí o clashing, o grande problema do md5 e derivados (sha1).

Os ataques a este tipo de encriptação não se dão por tentiva de desencriptação mas sim pela procura de uma palavra cuja encriptação resulte na mesma chave, independentemente se essa chave é um simples md5 ou uma amalgama de md5(sha1(xpto( ... yptz('ola')... ))).

Não garante a  segurança porquê tens alguma prova que não garante ? ou estas só a tentar complicar  ?

Citação

Repara que todas o md5 e o sha1 fazem uma geração de uma chave com um determinado tamanho. Ou seja, há mais de uma string que vai resultar exactamente nessa chave, daí o clashing, o grande problema do md5 e derivados (sha1).

Tens que saber como é que é feito essa "desencriptação" ok :)

Citação

Os ataques a este tipo de encriptação não se dão por tentiva de desencriptação mas sim pela procura de uma palavra cuja encriptação resulte na mesma chave, independentemente se essa chave é um simples md5 ou uma amalgama de md5(sha1(xpto( ... yptz('ola')... ))).

E achas que vai resultar ? com o serialize() não foi apenas encriptada a palavra mas sim  estes caracteres ; . ! 5 : http://php.net/serialize

Odeio quando as pessoas falam sem saber só para tentarem complicar.. mas pronto :)

EDIT: Já agora é possivel desencriptar uma palavra que não existe ? se não é possivel então não digam que é possivel desencriptar :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Em 8/2/2006 às 15:43, kingless disse:

[...]

Sabes quantos caracteres tem sha1 ? sha1 tem 42 caracteres.  Sabes quantos caracteres tem md5 ? md5 tem 32 caracteres...  Sabes como os desencriptadores funcionam ? Os desencriptadores de md5 são palavras que os donos dos desencriptadores  encriptam e colocam na base de dados e quando alguem procurar por uma md5 se ela estiver na base de dados aquilo retorna a palavra da md5... Nenhum desencriptador desencripta a propria palavra... nenhuma pessoa consegue desencriptar essa sha1 e não vale a pena tentares discutir sem teres razão.

Acho que não compreendeste. Como eu já referi acima, o problema não é a desencriptação, mas sim o clashing de chaves.

O SHA1 não é inquebrável como podes ver aqui.

Citação
Em 8/2/2006 às 14:58, M6 disse:
Em 8/2/2006 às 10:44, kingless disse:

Não te esqueças que não é apenas md5 mas sim sha1 que é impossivel desencriptar, o que os desencriptadores fazem é desencriptar a senha md5 para uma string e não para sha1 depois base64_encode e o resto... E por isso posso te garantir que é IMPOSSIVEL.

Impossível? :) Isso foi exactamente o que o inventor do MD5/SHAx disse... Alguns anos mais tarde provou-se o contrário. :P

NÂO É POSSIVEL SE DESENCRIPTAR MD5...  O acontece não se pode chamar desencriptar, o que estas a chamar de desencriptar são palavras adicionadas numa base dados  e quando alguem procura por uma md5 se a palavra dessa md5 existir na base de dados aquilo retorna a palavra... caso contrario não retorna nada. POR ISSO NÂO SE PODE CHAMAR DE DESENCRIPTAÇÃO.

Antes de mais, não "grites" porque felizmente não sou surdo.

Como já inumeras vezes referi desde o início, o problema não é a desencriptação, mas sim o clashing de chaves. Eu nunca falei em desencriptação mas sim em descobrir uma palavra cuja chave seja igual ao código original, é ai que reside o problema.

Citação
Citação

kingless, aplicar várias operações de encriptação de forma sequencia não garante mais segurança.

Repara que todas o md5 e o sha1 fazem uma geração de uma chave com um determinado tamanho. Ou seja, há mais de uma string que vai resultar exactamente nessa chave, daí o clashing, o grande problema do md5 e derivados (sha1).

Os ataques a este tipo de encriptação não se dão por tentiva de desencriptação mas sim pela procura de uma palavra cuja encriptação resulte na mesma chave, independentemente se essa chave é um simples md5 ou uma amalgama de md5(sha1(xpto( ... yptz('ola')... ))).

Não garante a  segurança porquê tens alguma prova que não garante ? ou estas só a tentar complicar  ?

Não garante a segurança por duas razões muito simples:

1. para inputs diferentes, a função MD5 resulta na mesma chave, logo, daí para a frente é tudo igual.

2. a última função que aplicas é o SHA1, que converte o que quer que tenhas numa chave de tamanho fixo, exactamente como obterias usando o SHA1 original, com uma pequena diferença, tem "ruido" à mistura.

Sabendo que o teu universo é limitado a uma palavra de tamanho fixo usando um determinado conjunto de símbolos, acabas por ficar na mesma situação do SHA1 original.

Abaixo exemplifico com um caso para que se perceba melhor...

Citação
Citação

Repara que todas o md5 e o sha1 fazem uma geração de uma chave com um determinado tamanho. Ou seja, há mais de uma string que vai resultar exactamente nessa chave, daí o clashing, o grande problema do md5 e derivados (sha1).

Tens que saber como é que é feito essa "desencriptação" ok :)

Citação

Os ataques a este tipo de encriptação não se dão por tentiva de desencriptação mas sim pela procura de uma palavra cuja encriptação resulte na mesma chave, independentemente se essa chave é um simples md5 ou uma amalgama de md5(sha1(xpto( ... yptz('ola')... ))).

E achas que vai resultar ? com o serialize() não foi apenas encriptada a palavra mas sim  estes caracteres ; . ! 5 : http://php.net/serialize

Odeio quando as pessoas falam sem saber só para tentarem complicar.. mas pronto :)

Isso é porque não sabes aceitar uma critica e assumes de imediato que isso é um ataque.

Sejamos pragmáticos. Pelo que compreendi do teu algoritmo, a primeira função de encriptação que usas é o MD5.

Ora sabendo que o MD5 não é fiável uma vez que é possível de quebrar, então existe um conjunto de palavras que vão permitir que quebrar o algoritmo que fizeste.

Vamos seguir um caso prático. Por exemplo, imaginemos que o MD5 de "aaa" é "ABCD", e que o MD5 de "agz", "jkl" são é também "aaa" (o verdadeiro perigo do MD5).

Ora, por mais funções que apliques, usar "aaa", "agz" ou "jlk" vai resultar, no final da aplicação das funções, no mesmo código "ABCD", ou seja, a aplicação sequencial de funções não trouxe nenhuma segurança acrescida.

O próximo passo é pensar: "então misturo ruido na palavra original", ou seja, junta-se ao "aaa" um "xpto123" e obtenho "FGJI". Só que, dado o facto do clashing de chaves existir no MD5, então vão haver outras palavras que quando juntas com o "xpto123" vão também resultar em "FGJI".

É por isso que afirmei que juntar funções de forma sequencial não implica um aumento de segurança per se.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não vou discutir mais este assunto tens de tentar compreender como é que a função funciona, só vou discutir com alguem que saiba o que a função faz e o que fala.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois acho que já foi provado que é não é inquebravel, agora resta saber é se é realmente viavel faze-lo?

Pergunto-me quantos decriptadores de md5 e sha1 existem por ai que façam um trabalho eficiente?

Provavelmente muito poucos e o mais provavel é serem também muito lentos (pelo menos os que vi de md5 eram bastante lentos e não são 100% certos de encontrar a chave correcta) :P

É uma boa ideia utilizar essa função eu próprio construi uma parecida para mim antes e nunca tive problemas :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para começar, sha1 é 40 caracteres e não 42. segundo não afirmes que é impossivel em letras maiusculas porque só te enterras mais.

já existem por ai algoritmos capazes de descobrir uma hash md5 num computador com mais ou menos bom hardware em menos de uma hora. por isso não te fies mt nessa impossibilidade. para o sha1 não deve faltar muito a acontecer o mesmo.

podes tar correcto nas probabilidades, é pouco provavel que alguem va hackar, mas se é assim, porque não usar apenas md5() ou sha1() de uma maneira ou de outra vai dar ao mesmo. se alguem invadir a base de dados e encontrar a hash, as probabilidades de conseguir descobrir a password correspondente, são iguais quer usando apenas md5() ou a tua função. o base64_encode(), serialize() e preg_replace, não adianta de nada, porque ha funções que fazem o contrario. a unica diferença é que tens md5(sha1()).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou mostrar como funciona a função para que todos entendam

function Hash_Seguro( $senha ) {

$alfanum = array( '/a/i', '/b/i', '/c/i', '/d/i', '/e/', '/f/i', '/g/i', '/h/i', '/i/i',
                                  '/j/i', '/k/i', '/l/i', '/m/i', '/n/i', '/o/i', '/p/i', '/q/i', '/r/i',
                                  '/s/i', '/t/i', '/u/i', '/v/i', '/w/i', '/x/i', '/y/i', '/z/i', '/0/i',
                                   '/1/i', '/2/i', '/3/i', '/4/i', '/5/i', '/6/i', '/7/i', '/8/i', '/9/i' );

$Hash = array(  'ç', 'ß', 'æ', '?', 'º', '^', '»', 'µ', ';',
                             '¶', 'ø', 'þ', 'ð', '¢', 'n', '¬', '¹', '@',
                             '£', '§', '½', '{', '[', '`', '~', '_', '«',
                              '.','=', '}', '!', '|', '"', '#', '$', '%' );

$HashSeguro = md5( sha1( base64_encode( serialize( addslashes( preg_replace( $alfanum, $Hash, $senha ) ) ) ) ) );
return $HashSeguro;
}

Vamos imaginar um formulario de Login de um usuario

<form action="" method="post">

<input type="text" name="usuario">

<input type="text" name="senha">

<input type="submit" name="submit" value="enviar">

</form>

O usuario vai escrever o usuario e a senha (ninguem sabe a senha a não ser o usuario)

O que é que o hash seguro vai fazer ?

vamos começar pelo preg_replace

A senha do usuario é  ******  (ninguem sabe só o proprio usuario é que sabe)

o preg_replace vai trocar a senha do user que é ****** pelos seus respectivos valores podem ser um desses $ð€^łđ~ðæ@¶ŋđħ|"#$%[{?«_ ninguem sabe

vamos imaginar que depois do preg_replace  a senha vai ficar assim ðæ@¶ŋ  (mas ninguem sabe que ficou assim porque ninguem sabe a senha do usuario, e isso foi uma encriptação manual)

O addslahes vai adicionar slashes a senha se for preciso (vamos sempre ficar na duvida se adicionou ou não)

o serialize vai encriptar a senha em algo como s:5:"ðæ@¶?"; (mas ninguem sabe que a senha se tornou nisso,)

o base64_encode vai encriptar a senha em algo como czo1OiLw5kC2PyI7 (mas lembrem-se que ninguem sabe...)

o sha1 vai encriptar a senha em algo como 212b62b229247501b7c7c4470287c6cff18c20d  (é possivel se desencriptar sha1 ? NÂO, então aqui ja é impossivel desencriptar... e encriptou  czo1OiLw5kC2PyI7 e não s:5:"ðæ@¶?"; e muito menos a senha ******)

o md5 vai encriptar a senha em algo como e27a2e0370079630b54ddcfe0a8ba7a6 (pronto aqui já é quase impossivel desencriptar, mas porquê ? será que algem foi logo encriptar em md5 essa senha sha1 212b62b229247501b7c7c4470287c6cff18c20d ? claro que não porque existem bilhões se senhas sha1...

Os "desencriptadores" de md5 têm uma base de dados com as strings e os seus respetivos valores por exemplo na base de dados tem kingless com a md5 a2e30b5b1aa67e4d3cb6a53ccf49f2cc,  eu vou la e procurar pela md5 de a2e30b5b1aa67e4d3cb6a53ccf49f2cc  aquilo vai mostrar  kingless  mas se eu procurar por uma md5 que não estiver na base de dados aquilo não mostra nada.

Agora qual é a probabilidade de aquilo mostrar a senha que o usuario digitou ?  0%  porquê ?  porque é suposto mostrar a senha sha1 e o dono do desencriptador não ia logo pensar naquela senha sha1 e adicionar a base de dados.

Mas se por acaso mostrar a senha sha1 ? Será IMPOSSIVEL desencriptar a senha sha1.

Mas não pode mesmo mostrar a senha do usuario ? Não porque aquilo encriptou a senha sha1 e não a senha do usuario, é só pensar um pouco...

Tentei explicar o maximo, Agora só precisam de pensar com a cabeça e tirarem conclusões. 

As mentes são como os pára-quedas, de nada servem se não estiverem abertas!  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

epa, lé tudo que eu disse de novo... não adianta nada explicares isso assim (apesar de não teres explicado correctamente, porque tens coisas mal) porque eu já sabia exactamente o que faz a função e continuo a dizer o que sempre disse la em cima nos outros posts. a unica vatangem disso é o md5 e o sha1, o resto não interessa pa nada.

"ninguem sabe..." pah, toda a gente sabe. basta ver o teu codigo, é php, é o teu cms, vais disponibilizar isso, toda a gente vai ver o codigo...

logo, supondo que alguem descobria o resultado da hash md5, iriamos ficar com uma hash sha1, supondo que alguem descobria o resultado dessa hash, iriamos ficar com um valor qualquer. após isto bastava fazer um base64_decode() depois um unseralize() e dps um preg_replace mas ao contrario e teriamos a password do user.

como vês, não é assim tão seguro. a unica segurança que isso tem, esta no md5 e no sha1. se é seguro ou não, se é possivel desincriptar ou não, não interessa muito agora porque a questão não era essa, mas sim se essa tua função é ou não mais segura que usar apenas md5 e/ou sha1 em conjunto, resposta, não é, vai dar ao mesmo, a não ser que não se tenha acesso ao codigo para adivinhar todas as "encriptações feitas", nesse caso é mais seguro.

e escusas de bater sempre na mesma tecla dos "desincriptadores" de md5 porque sim, existem montes de bases de dados com hashes md5, mas também, como já referi anteriormente. existem algoritmos que não usam qualquer tipo de base de dados, para descobrir o valor de uma hash md5, portanto, esquece as bases de dados que isos já é antigo. quanto ao sha1, não faço ideia como anda, mas que é mais seguro k md5, é, não sei até que ponto, mas é; apesar de ser baseado no mesmo algoritmo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

epa, lé tudo que eu disse de novo... não adianta nada explicares isso assim (apesar de não teres explicado correctamente, porque tens coisas mal) porque eu já sabia exactamente o que faz a função e continuo a dizer o que sempre disse la em cima nos outros posts. a unica vatangem disso é o md5 e o sha1, o resto não interessa pa nada.

"ninguem sabe..." pah, toda a gente sabe. basta ver o teu codigo, é php, é o teu cms, vais disponibilizar isso, toda a gente vai ver o codigo...

logo, supondo que alguem descobria o resultado da hash md5, iriamos ficar com uma hash sha1, supondo que alguem descobria o resultado dessa hash, iriamos ficar com um valor qualquer. após isto bastava fazer um base64_decode() depois um unseralize() e dps um preg_replace mas ao contrario e teriamos a password do user.

como vês, não é assim tão seguro. a unica segurança que isso tem, esta no md5 e no sha1. se é seguro ou não, se é possivel desincriptar ou não, não interessa muito agora porque a questão não era essa, mas sim se essa tua função é ou não mais segura que usar apenas md5 e/ou sha1 em conjunto, resposta, não é, vai dar ao mesmo, a não ser que não se tenha acesso ao codigo para adivinhar todas as "encriptações feitas", nesse caso é mais seguro.

e escusas de bater sempre na mesma tecla dos "desincriptadores" de md5 porque sim, existem montes de bases de dados com hashes md5, mas também, como já referi anteriormente. existem algoritmos que não usam qualquer tipo de base de dados, para descobrir o valor de uma hash md5, portanto, esquece as bases de dados que isos já é antigo. quanto ao sha1, não faço ideia como anda, mas que é mais seguro k md5, é, não sei até que ponto, mas é; apesar de ser baseado no mesmo algoritmo.

Eu continuo com a ideia que não é possivel desencriptar... vamos manter cada um a sua ideia.

No meu CMS já não vou utilizar essa função vou utilizar  mhash_keygen_s2k();

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas como é k podes achar uma coisa dessas quando já foi descoberto como se faz isso e ate o codigo anda a circular na net... é que aqui não se tratar de acreditar em algo que ainda não foi possivel comprovar, mas de algo que já foi provado. mas nao é bem desincriptar que lhe chamam mas faz o seu trabalho... num bom pc deve demorar cerca de 45 minutos, mas das-lhe uma hash e ele da-te o resultado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra-me só um programa que desencripta a md5 para sha1 para eu experimentar... é que custa acreditar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois acho que já foi provado que é não é inquebravel, agora resta saber é se é realmente viavel faze-lo?

Pergunto-me quantos decriptadores de md5 e sha1 existem por ai que façam um trabalho eficiente?

Provavelmente muito poucos e o mais provavel é serem também muito lentos (pelo menos os que vi de md5 eram bastante lentos e não são 100% certos de encontrar a chave correcta) :P

É uma boa ideia utilizar essa função eu próprio construi uma parecida para mim antes e nunca tive problemas :)

Quanto ao SHA1 não sei, mas a última vez que vi sobre a quebra do MD5 o mesmo conseguia ser quebrado em menos de um minuto por um PC normalissimo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou mostrar como funciona a função para que todos entendam

function Hash_Seguro( $senha ) {

$alfanum = array( '/a/i', '/b/i', '/c/i', '/d/i', '/e/', '/f/i', '/g/i', '/h/i', '/i/i',
                                  '/j/i', '/k/i', '/l/i', '/m/i', '/n/i', '/o/i', '/p/i', '/q/i', '/r/i',
                                  '/s/i', '/t/i', '/u/i', '/v/i', '/w/i', '/x/i', '/y/i', '/z/i', '/0/i',
                                   '/1/i', '/2/i', '/3/i', '/4/i', '/5/i', '/6/i', '/7/i', '/8/i', '/9/i' );

$Hash = array(  'ç', 'ß', 'æ', '?', 'º', '^', '»', 'µ', ';',
                             '¶', 'ø', 'þ', 'ð', '¢', 'n', '¬', '¹', '@',
                             '£', '§', '½', '{', '[', '`', '~', '_', '«',
                              '.','=', '}', '!', '|', '"', '#', '$', '%' );

$HashSeguro = md5( sha1( base64_encode( serialize( addslashes( preg_replace( $alfanum, $Hash, $senha ) ) ) ) ) );
return $HashSeguro;
}

Vamos imaginar um formulario de Login de um usuario

<form action="" method="post">

<input type="text" name="usuario">

<input type="text" name="senha">

<input type="submit" name="submit" value="enviar">

</form>

O usuario vai escrever o usuario e a senha (ninguem sabe a senha a não ser o usuario)

O que é um usuário???

O que é que o hash seguro vai fazer ?

vamos começar pelo preg_replace

A senha do usuario é  ******  (ninguem sabe só o proprio usuario é que sabe)

Primeiro ponto de falha: dadas as características da tua função de encriptação, herdadas em parte do MD5 e do SHA1, tens um conjunto de outras senhas que, quando encriptadas, resultarão exactamente na mesma chave final. Já expliquei isto acima em maior detalhe.

[...]

Os "desencriptadores" de md5 têm uma base de dados com as strings e os seus respetivos valores por exemplo na base de dados tem kingless com a md5 a2e30b5b1aa67e4d3cb6a53ccf49f2cc,  eu vou la e procurar pela md5 de a2e30b5b1aa67e4d3cb6a53ccf49f2cc  aquilo vai mostrar  kingless  mas se eu procurar por uma md5 que não estiver na base de dados aquilo não mostra nada.

Agora qual é a probabilidade de aquilo mostrar a senha que o usuario digitou ?  0%  porquê ?  porque é suposto mostrar a senha sha1 e o dono do desencriptador não ia logo pensar naquela senha sha1 e adicionar a base de dados.

Mas se por acaso mostrar a senha sha1 ? Será IMPOSSIVEL desencriptar a senha sha1.

Mas não pode mesmo mostrar a senha do usuario ? Não porque aquilo encriptou a senha sha1 e não a senha do usuario, é só pensar um pouco...

Segundo ponto de falha: não estás a compreender que este esquema sofre das mesmas falhas que o SHA1.

Acreditas, erradamente, que por alterares a senha original do utilizador várias vezes essa mutação torna o teu esquema mais seguro, mas na realidade ele é tão seguro quanto o SHA1.

Vou explicar: independentemente da string que chega ao SHA1, existem outras cuja chave gerada é exactamente a mesma.

Um exemplo prático para que se perceba melhor: admitindo que para a string "aaa" (a senha do utilizado), o SHA1("aaa") é "ASDF". A falha do SHA1 acontece porque há outras strings cujo resultado vai ser "ASDF", por exemplo "bbb" e "ccc". Outras strings terão, óbviamente outras chaves, por exemplo, "asd" e "qwe" resultam em "YUIO"...

Ou seja SHA1("aaa") = SHA1("bbb") = SHA1("ccc") = "ASDF" e SHA1("asd") = SHA1("qwe") = "YUIO"

Ora, o esquema em causa falha porque quem o desenhou está a que as mutações que a string original "aaa" sofreu aumentam a segurança, mas pensar assim é erro como vou explicar de seguida.

A senha original do utilizador, "aaa", após as mutações do esquema aqui apresentado, resulta numa qualquer outra string, por exemplo "asd".

Ora SHA1("asd") = "YUIO", mas dado o facto de existirem outras strings que resultam no mesmo código, o mesmo não é inquebrável, pois SAH1("qwe") = "YOIO".

Ou seja, as mutações sofridas pela string a codificar pelo SHA1 são irrelevantes, pois existem sempre outras strings cuja codificação SHA1 resulta no mesmo código.

Creio que a explicação que dei é compreensível e ilustra que o esquema aqui apresentado possui as mesmas falhas que o SHA1.

Tentei explicar o maximo, Agora só precisam de pensar com a cabeça e tirarem conclusões. 

Já fiz isso e como vez não foi difícil encontrar pontos de falha que, de forma simples, se resumem aos problemas do SHA1.

As mentes são como os pára-quedas, de nada servem se não estiverem abertas!  :P

E tu devias ter a tua aberta e admitir que o teu esquema é (como acontece na realidade) quebrável.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só quero que me mostrem um programa para experimentar... Caso o programa desencripte ai eu vou afirmar que é quebravel  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra-me só um programa que desencripta a md5 para sha1 para eu experimentar... é que custa acreditar...

eu nc disse tal coisa lol... o k eu disse é k ha algoritmos que descobrem o valor da hash md5, não disse que transformava em "sha1". ms se a hash a descobrir tivesse sido criada pela tua função, então o resultado ia ser uma hash sha1 pk foi a primeira "encriptação" feita antes do md5().

mas eu não tenho que te provar nada, acredita no que quiseres, todos somos livres de o fazer. ou então procura no google se não acreditas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

já procurei no google e não encontrei nenhum desencriptador, a não ser aqueles que guardam umas tantas md5 numa base de dados e depois é só procurar. E como eu ja te tinha dito antes é melhor ficar cada um com a sua ideia que é melhor... niguem é obrigado a acreditar no que o outro diz.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

já procurei no google e não encontrei nenhum desencriptador, a não ser aqueles que guardam umas tantas md5 numa base de dados e depois é só procurar. E como eu ja te tinha dito antes é melhor ficar cada um com a sua ideia que é melhor... niguem é obrigado a acreditar no que o outro diz.

Neste caso, num assunto de segurança, acho que não devia ficar cada um com cada ideia, pois se essa tua técnica não for segura, pode por em causa a segurança dos users do teu CMS.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O meu CMS não vai utilizar essa função mas sim mhash_keygen_s2k();  é fácil falar o que todos já sabem acerca do md5 o dificil é provar que é possivel desencriptar esta função.. não é provar com palavras acerca da segurança do md5 que todos já sabemos, têm é que provar que a função não é segura com o programa que consiga desencriptar uma hash dessa função.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se quizeres ainda podes meter pelo meio a função strrev() e ai pronto adeus.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

kingless, ainda não conseguiste perceber que ninguém está dizer que a tua chave codificada pode ser desincriptada, mas sim que se consegue descobrir a chave de várias formas. O problema com o MD5 é que mais do que uma chave pode dar origem à mesma chave encriptada.

Compreendo que aches que tens uma boa forma de encriptar dados de forma a que não sejam desencriptados, mas a segurança de um site não depende na desencriptação da chave, mas sim de encontrar uma chave que ao passar pelas tuas funções gere uma chave igual para conseguirem entrar no site.

Hoje em dia, raras são as situações onde os crackers/hackers tentam chegar à chave original, eles querem é uma que codificada seja igual à original codificada.

Outra coisa, não fales com as pessoas como se fosses o supra-sumo de tudo. Quem te responde é porque talvez percebam um pouco do que estão a falar e se calhar querem-te mostrar que embora digas que não consegues desencriptar, consegues-se crackar, que é o mais importante.

Se gostas assim tanto de encriptação, lê a Fortalez Digital do Dan Brown para poderes começar a imaginar um algoritmo inquebrável ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

kingless, ainda não conseguiste perceber que ninguém está dizer que a tua chave codificada pode ser desincriptada, mas sim que se consegue descobrir a chave de várias formas. O problema com o MD5 é que mais do que uma chave pode dar origem à mesma chave encriptada.

Quais são as formas em que se pode descobrir a chave de uma MD5 desta função ?

Compreendo que aches que tens uma boa forma de encriptar dados de forma a que não sejam desencriptados, mas a segurança de um site não depende na desencriptação da chave, [b}mas sim de encontrar uma chave que ao passar pelas tuas funções gere uma chave igual para conseguirem entrar no site.[/b]

 

Para entrarem no site não é preciso gerar uma chave igual... (não é preciso desencriptar uma chave encriptada)

Hoje em dia, raras são as situações onde os crackers/hackers tentam chegar à chave original, eles querem é uma que codificada seja igual à original codificada.

Não entendi o queres dizer com isso...

Quem te responde é porque talvez percebam um pouco do que estão a falar e se calhar querem-te mostrar que embora digas que não consegues desencriptar, consegues-se crackar, que é o mais importante.

Se não conseguem desencriptar, vão conseguir crackar ? nahhh

Se gostas assim tanto de encriptação, lê a Fortalez Digital do Dan Brown para poderes começar a imaginar um algoritmo inquebrável ...

Não gosto de encriptação só fiz essa função para um CMS (Content management system) que estou a fazer, mas já não vou utilizar essa mas sim mhash_keygen_s2k((); 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora