kingless Posted August 2, 2006 at 01:56 AM Report #41627 Posted August 2, 2006 at 01:56 AM 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.. 😞
M6 Posted August 2, 2006 at 09:15 AM Report #41654 Posted August 2, 2006 at 09:15 AM 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. 😞 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar."
kingless Posted August 2, 2006 at 09:44 AM Author Report #41655 Posted August 2, 2006 at 09:44 AM 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...
Guest id194 Posted August 2, 2006 at 11:01 AM Report #41668 Posted August 2, 2006 at 11:01 AM 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...
M6 Posted August 2, 2006 at 01:58 PM Report #41713 Posted August 2, 2006 at 01:58 PM 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. 😛 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')... ))). 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar."
kingless Posted August 2, 2006 at 02:43 PM Author Report #41737 Posted August 2, 2006 at 02:43 PM Em 02/08/2006 às 13: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 😛 Sabes como é que alguem ataca a base de dados de um servidor ? se não sabes nem vale a pena discutires este assunto. Em 02/08/2006 às 15:58, M6 disse: Impossível? 😄 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 🙂
M6 Posted August 2, 2006 at 03:22 PM Report #41749 Posted August 2, 2006 at 03:22 PM Em 02/08/2006 às 16: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 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 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 Tens que saber como é que é feito essa "desencriptação" ok 🙂 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. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar."
kingless Posted August 2, 2006 at 03:32 PM Author Report #41754 Posted August 2, 2006 at 03:32 PM 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
QuickFire Posted August 2, 2006 at 04:06 PM Report #41757 Posted August 2, 2006 at 04:06 PM 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) 😛 É uma boa ideia utilizar essa função eu próprio construi uma parecida para mim antes e nunca tive problemas 🙂
Guest id194 Posted August 2, 2006 at 04:25 PM Report #41759 Posted August 2, 2006 at 04:25 PM 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()).
kingless Posted August 2, 2006 at 04:56 PM Author Report #41769 Posted August 2, 2006 at 04:56 PM 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! 😛
Guest id194 Posted August 3, 2006 at 12:34 AM Report #41852 Posted August 3, 2006 at 12:34 AM 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.
kingless Posted August 3, 2006 at 12:41 AM Author Report #41854 Posted August 3, 2006 at 12:41 AM 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();
Guest id194 Posted August 3, 2006 at 12:46 AM Report #41858 Posted August 3, 2006 at 12:46 AM 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...
kingless Posted August 3, 2006 at 12:48 AM Author Report #41859 Posted August 3, 2006 at 12:48 AM Mostra-me só um programa que desencripta a md5 para sha1 para eu experimentar... é que custa acreditar...
M6 Posted August 3, 2006 at 10:42 AM Report #41912 Posted August 3, 2006 at 10:42 AM 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) 😛 É 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... 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar."
M6 Posted August 3, 2006 at 11:08 AM Report #41918 Posted August 3, 2006 at 11:08 AM 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! 😛 E tu devias ter a tua aberta e admitir que o teu esquema é (como acontece na realidade) quebrável. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar."
kingless Posted August 3, 2006 at 11:10 AM Author Report #41919 Posted August 3, 2006 at 11:10 AM Só quero que me mostrem um programa para experimentar... Caso o programa desencripte ai eu vou afirmar que é quebravel 😛
Guest id194 Posted August 3, 2006 at 01:01 PM Report #41936 Posted August 3, 2006 at 01:01 PM 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.
kingless Posted August 3, 2006 at 02:35 PM Author Report #41954 Posted August 3, 2006 at 02:35 PM 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.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now