Avatar billede kasbas91 Nybegynder
30. december 2010 - 15:13 Der er 30 kommentarer og
2 løsninger

Hej jeg har lige et hurtigt spørgsmål, vedr en meget krypteret hash sting..

Hej eksperten.dk


Jeg skal bruge en meget krypteret hash string,

som man ikke rigtig kan knække..

Men jeg har lavet function her:



function _activateKey(){
$activatekey = array("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
$saltarray1  = array("12345678998765432115975364821abcdefghijklmnopqrstuvwxyz8998765");
$saltarray2  = array("12345678998765432115975364445445454548878712345678998765412765");
$saltarray3  = array_merge($activatekey, $saltarray1, $saltarray2);

asort($saltarray3);

$activatestring = null;
                   
    foreach($saltarray3 as $saltkeys){
        for($i = null; $i < 20; $i++){
        $activatestring .= mt_rand(0, strlen(sha1($saltkeys)));   
        }
    }
    return $activatestring;
}



Men så er mit spørgmål, er den her function jeg har samlet sammen.. Er den god eller hvad.. Den laver en okay string:

94024382037739293422843424263724252532313332213512111301627072524281234391522222612292015122221219113732392812

Men er den okay, eller er den meget dårlig...

;P
Avatar billede repox Seniormester
30. december 2010 - 15:19 #1
Hvorfor ikke bare bruge SHA512, hvis det skal være så sikkert?
echo hash("sha512", "din streng");

Det andet der virker utrolig bøvlet...
Avatar billede kasbas91 Nybegynder
30. december 2010 - 15:23 #2
Er den da bedre...
Avatar billede kasbas91 Nybegynder
30. december 2010 - 15:26 #3
Fordi den må ikke kunne decrypteres.. ;P
Avatar billede repox Seniormester
30. december 2010 - 15:33 #4
Det er det der kendetegner et HASH - det er en etvejs 'kryptering' - du kan ikke 'regne den tilbage' - men alt er jo en sandhed med modifikationer.

SHA1 var på et tidspunkt det mest sikre, men blev i 2005 udsat for noget kritik idét det var ment at den havde visse matematiske svagheder. Selvom SHA256 har visse sammenfald med SHA1, er den ikke sårbar overfor de svagheder.

Den nuværende teknologi har ikke held med at bryde SHA256 hashet, så hvis du smider den gennem SHA512, så kan du vist ikke være mere sikker.
Avatar billede arne_v Ekspert
30. december 2010 - 15:33 #5
Jeg tror ikke at SHA512 duer he. SHA512 er super til at lave en hash af et password.

Men det her er en activation key hvor der ikke er noget input og som ikke skal gentage sig selv.
Avatar billede kasbas91 Nybegynder
30. december 2010 - 15:37 #6
Ja, men den skal bare være sikker..

Men den løsning jeg har lavet duer ikke til

activation key eller hvad.. ;P
Avatar billede repox Seniormester
30. december 2010 - 15:41 #7
#5
Jeg er ikke helt enig - jeg bruger en SHA256 streng til at aktivere medlemmer på et site jeg har arbejdet på.

<?php
  ...
  public function updateAccount( $cct )
  {
    $res = $this->dal->query("UPDATE users SET uActive='true' WHERE SHA2(CONCAT(userId, userKey), '256') = ?", array($cct));
    return $res;
  }
  ...
?>
Avatar billede arne_v Ekspert
30. december 2010 - 15:45 #8
Men SHA2(CONCAT(userId, userKey), '256') er givet ved userID og userKey, så sikkerheden afhænger af at de er svære at gætte.
Avatar billede repox Seniormester
30. december 2010 - 15:46 #9
#6
Man kan måske tale for at der ikke er nogen grund til at generere noget ud fra en HASH-algoritme som skal kunne identificere noget, hvis det blot er til at aktivere noget; så kan du jo lige så godt bare generere en unik streng i stedet og knytte den til en bruger/entry.

Om den er på 32 tegn eller 128 eller hvor lang den bliver er ikke så vigtig - bare du ikke overlapper med andre entries.
Avatar billede repox Seniormester
30. december 2010 - 15:47 #10
#8
Naturligvis :) userKey består af en 128 tegn lang streng med tilfældigt genereret indhold.
Avatar billede kasbas91 Nybegynder
30. december 2010 - 15:55 #11
Men man skal ikke være bange for hvis man laver den sådan her:


$passtring = null;
                           
for($i = null; $i < 50; $i++){
    $passtring .= mt_rand(0, strlen(hash_hmac('SHA512', '814f0038ed95f0246bb58d0115f0246bb367a1ebca574c86', '814f0038ed95f0246bb58d011367a1ebca574c86')));
}


At den vil lave 2 eller flere der er ens. ;P
Avatar billede arne_v Ekspert
30. december 2010 - 15:56 #12
Nu kan man hævde at sikkerheden i en aktivering på et site hvor udvikleren spørger på eksperten.dk formentligt ikke behøver at være tårnhøj.

Men hvis vi nu hypotetisk siger at det er vigtigt at den aktiverings key skal være virkeligt svært at gætte, så er tricket at der skal bruges noget input som er uforudsigeligt.

PHP kommer mig bekendt ikke med en kryptografisk sikker RNG.

Hashing hjælper ikke spor med det. Hashing er *i denne sammenhæng* bare en konvertering fra noget variabel længde data til fast længde data. Og hex/base64 konverterer fra alle tegn til et begrænset antal tegn.

Kilder til input:
* tiden fra en high resolution clock
* system info såsom "ps aux" output på *nix
* OS RNG såsom /dev/random og /dev/urandom på *nix

Så tag en mængde input fra disse kilder, hvor det mulige udfaldsrum er større end antal hash værdier for den hash algoritme du bruger, hash dem og brug den.
Avatar billede kasbas91 Nybegynder
30. december 2010 - 16:07 #13
Ja, hvad med sådan en her.

Med microtime();

$passkey = "";
                   
for($i = null; $i < 1; $i++){
$passkey .= hash_hmac('sha512', microtime(), '123456789321654987');
}
                   
echo $passkey;

Hvad mener du med * tiden fra en high resolution clock.
Avatar billede repox Seniormester
30. december 2010 - 16:08 #14
#12
Jeg er ganske enig med dig.

PHP har kun pseudo RNG, men det må også - som du selv er inde på - være effektivt nok ud fra niveauet.
Avatar billede kasbas91 Nybegynder
30. december 2010 - 16:15 #15
Hej undskyld men jeg forstår ikke helt det der:

RNG, er det ikke bare random number generator.

Som man evt, kan bruge rand() til..

Eller hvad.
Avatar billede repox Seniormester
30. december 2010 - 16:17 #16
Avatar billede kasbas91 Nybegynder
30. december 2010 - 16:26 #17
Okay, men det bliver jo lavet som et billede.. ?
Avatar billede kasbas91 Nybegynder
30. december 2010 - 16:31 #18
Men ja det bliver jo lavet som random...
Avatar billede ksoren Nybegynder
30. december 2010 - 16:46 #19
Man har før læst om angreb på programkode, som baserer sin sikkerhed på "svage" tilfældighedsgeneratorer. Kan man finde en svaghed, kan den måske bruges til at lave kvalificerede gæt.
Avatar billede kasbas91 Nybegynder
30. december 2010 - 16:56 #20
Jeg forstår det stadig ikke helt..
Avatar billede arne_v Ekspert
30. december 2010 - 18:26 #21
En high resolution clock er noget der kan give tid med hør præcision d.v.s. ikke kun f.eks. sekunder.
Avatar billede danco Nybegynder
30. december 2010 - 19:57 #22
Jeg har stadig ikke helt fundet ud af hvorfor spørger synes at sikkerheden skal være så til høj i en activate string, og det vedkommer såvidt heller ikke mig. Jeg tænker bare at i har gang i metoder der på sigt vil kræve meget stor regnekraft. Og hvis essensen således bare er at den skal være entydig op imod en database så synes jeg nu nok det ville være mere nærliggende at bruge sha1(time()) som "generator".
Avatar billede arne_v Ekspert
31. december 2010 - 02:23 #23
sha1(time())

ser ud som om den har 2^160 mulige værdier, hvilket er umuligt at gætte.

Men hvis vi antager at confirmation email altid når frem i løbet af 0-10 sekunder, så er der faktisk kun 10 relevante mulige værdier d.v.s. at sandsynligheden for at gætte rigtigt ved første gæt er mindst 1/10 og sandsynligheden for at gætte ved 10 forsøg er 1.

sha512(microtime())

ser ud som om den har 2^512 mulige værdier, hvilket (så vidt jeg ved) er flere end der er atomer i universet.

Men med samme antagelse som ovenfor om email, så er der kun 10 millioner relevante mulige værdier, så sandsynligheden for at gætte i første gæt er 1/10000000 og sandsynligheden for at gætte ved 1000 forsøg er 1/10000.
Dette forudsætter at computeren har en high resolution clock.

Er det godt nok? Det må man jo vurdere! Som alle ved er der kun 10000 mulige pin koder på et dankort og det lever folk med.

Men det er en god ide at have forstået og overvejet problemstillingen, så man kan træffe et kvalificeret valg.

Og man skal slet ikke lade sig dupere af en hash funktion med et højt antal bits.

Medmindre man har et stort antal eksterne bytes som input, så hjælper det ikke.
Avatar billede arne_v Ekspert
31. december 2010 - 02:27 #24
Og bemærk at alle forsøg med:

srand(tid)
string = lopp som henter "tilfældige" tegn via rand()
hash(string)

lider af præcis samme problem.

Der er kun det antal mulige værdier som der er relevante værdier for tiden.
Avatar billede repox Seniormester
02. januar 2011 - 22:26 #25
Tråden er måske også kommet lidt ud på et sidespor for spørger - med den tekniske viden og den snak det pludseligt har handlet om (som tidligere pointeret) er vi ud over det relevante for spørger, som måske ikke helt selv forstår indholdet af sit spørgsmål.

Det bedste ville måske være at den oprindelige funktion virker fint til det faktiske formål, men som sådan ikke har noget med kryptering eller hashing at gøre.
Avatar billede kasbas91 Nybegynder
03. januar 2011 - 21:45 #26
Jeg har valgt at lave en sha512 med microtime..

Men tak allesammen..

og læg et svar...
Avatar billede repox Seniormester
03. januar 2011 - 22:36 #27
Svar fra mig
Avatar billede ksoren Nybegynder
03. januar 2011 - 23:06 #28
Ps. Arnes pointe med at bruge tiden, er, at den kan man gætte kvalificeret på :)
Avatar billede arne_v Ekspert
04. januar 2011 - 01:41 #29
Med hensyn til relevans af forskellige betragtninger, så er der ikke noget galt i at beslutte at man kan leve med en vis risiko. Det gør alle inkl. bl.a. dankort og nemid. Men det er ike så godt at have truffet beslutningen uden at have forstået de mulige problemer. Så jeg finder betragtningerne meget relevante at få nævnt.
Avatar billede arne_v Ekspert
04. januar 2011 - 01:41 #30
og et svar fra mig
Avatar billede kasbas91 Nybegynder
04. januar 2011 - 15:16 #31
hvordan deler jeg point...
Avatar billede arne_v Ekspert
04. januar 2011 - 15:20 #32
Venter til alle har lagt svar og saetter flueben i alle.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester