Avatar billede webweaver Praktikant
21. januar 2011 - 20:55 Der er 11 kommentarer og
1 løsning

Salted hash

Halløj pro's.

Jeg er begyndt at kigge lidt på salt når vi snakker hash m.v.
Har været lidt gammeldags/stædig indtil videre, og holdt mig til PHP's md5(); funktion uden at opdatere mig, men den holder jo efterhånden ikke alene mere, eftersom diverse rainbow tables har udviklet sig en del.

Jeg har sådan set bare kastet mig ud i det, da logikken i det er forholsvis simpel. Jeg ønsker bare lidt feedback på metoden. Om jeg bør gøre det anderledes, og om I evt. har andre gode/smarte måder at udføre en kompetent salted hash? (der findes selvfølgelig 100 måder at lave et salt på)

$kodeord = $_POST["kodeord"];

define ('SALT_1', 11);
define ('SALT_2', 17);

function encrypt_password($string) {

if (defined('SALT_1')) {

$salt1 = substr(sha1(uniqid(rand(), true)), 0, SALT_1);

}

if (defined('SALT_2')) {

$salt2 = substr(sha1(uniqid(rand(), true)), 0, SALT_2);

}

$nyt_kodeord = $salt1 . sha1($string) . $salt2;

return $nyt_kodeord;

}

echo encrypt_password($kodeord);
Avatar billede arne_v Ekspert
21. januar 2011 - 21:31 #1
salt skal ind i sha1 !
Avatar billede arne_v Ekspert
21. januar 2011 - 21:31 #2
du bør nok bruge sha256 eller sha512 fremfor sha1, når du alligevel skal igang med at skifte.
Avatar billede arne_v Ekspert
21. januar 2011 - 21:33 #3
Det må være overflødigt at lave salt på så kompleks en måde.

64 eller 128 tilfældige bit. Og der er ikke behov for specielt super tilfældige tal.
Avatar billede arne_v Ekspert
21. januar 2011 - 21:34 #4
MD5 bør være bandlyst. Men jeg mener faktisk ikke at der findes komplette rainbow tables for MD5 endnu.
Avatar billede webweaver Praktikant
22. januar 2011 - 17:53 #5
Som jeg ser det, er mit salt inde i sha1? I substr encrypter jeg det.
Er det ikke nok at gøre det sådan?

Jeg startede faktisk med at bruge hash(); funktionen, så jeg evt. kunne bruge sha256, men af en eller anden årsag, kan jeg ikke få det til at virke på mit webhotel, så dem har jeg lige hevet fat i, og De undersøger sagen. Så indtil videre står den vidst bare på sha1. Kunne måske bruge crypt();, men kan bedre lide den anden.

Det har jeg også tænkt lidt på. Nu lavede jeg det på denne måde, fordi den bliver rimelig kompleks, men det er nok unødvendigt at gøre sådan og den bruger bare ekstra tid og resourcer på det. 1 salt vil typisk også være nok formentlig? Men et salt bør være unikt hver gang ikke?

Jeg havde faktisk tænkt på at kompleksificere systemet yderligere ved at hash'e saltet i 1 slags algoritme og så hash'e det hash'ede salt yderligere i en anden algoritme. Så det "krypterede blev krypteret". Men det er nok totalt overkill, og ved ikke om det ville virke i det hele taget.

Nope, der er ingen komplette rainbow tables endnu :)
Men det er desværre nok bare et spørgsmål om tid.
Avatar billede arne_v Ekspert
22. januar 2011 - 18:02 #6
$nyt_kodeord = $salt1 . sha1($string) . $salt2;

hasher ikke salt.

$nyt_kodeord = sha1($salt1 . $string . $salt2);

hasher salt.
Avatar billede arne_v Ekspert
22. januar 2011 - 18:04 #7
Salt skal opbevares i databasen sammen med det hashed password, så en hacker vil kende det.

Eneste krav er at det skal være så tilfældigt at det ikke findes i nogle forudberegnede tabeller.
Avatar billede webweaver Praktikant
22. januar 2011 - 18:22 #8
Er det ikke nok at hashe det 1 gang oppe i substringen og så lægge dem sammen bagefter? Så bliver det måske ikke en korrekt "sha1 bit værdi"? Så er der ingen grund til at hash'e den deroppe, hvis jeg vælger at gøre det til sidst i funktionen. I og med at jeg så hasher til sidst nu, har jeg 2 variabler indeholdende saltet som raw input. Er det et muligt sikkerhedsbrud? (så bør man måske beholde hash i subtr også) (jeg ved godt at det bare et et password, så der er grænser for hvor sikkert det skal være), men det er meget sjovt at rode med og gøre det "uigennemtrængeligt".

Og jeps, salt skal naturligvis gemmes i databasen, for ellers vil personen aldrig kunne logge ind igen, eftersom det er unikt.

Men blev faktisk i tvivl nu. Skal salt gemmes alene som hash eller plain text? Det burde vel være hashed, da ellers det jo lige er til at se, hvad der der er tillagt kodeordet. Og man må formode, at hvis en person kan få fat i det hashede password fra databasen, så kan han også få fat i saltet.
Avatar billede arne_v Ekspert
22. januar 2011 - 18:28 #9
Hvis du gemmer slat af hash kan du ikke bruge det til noget. Du skal jo bruge salt når du skal checke hash af password.
Avatar billede arne_v Ekspert
22. januar 2011 - 18:29 #10
$nyt_kodeord = $salt1 . sha1($string) . $salt2;

er værdiløst.

Den onde hacker fjerner bare $salt1 og $salt2 og slår du det der er tilbage op i en tabel over hash af kendte ord og sammensaetninger.
Avatar billede webweaver Praktikant
23. januar 2011 - 14:29 #11
Kan godt se problemet i at hashe på den måde. Som du siger, så kan personen bare skille det ad, og så er det egentlig ikke meget værd længere.

Jeg tror der er nogenlunde styr på det så. Ellers kan jeg bare vende tilbage jo. Smid du bare et svar, og tak for responsen :-)
Avatar billede arne_v Ekspert
23. januar 2011 - 14:39 #12
svar
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