Vilken typ av kryptering ska man använda för användarna och vad ska man välja i databasen när det kommer till att importera uppgifter?

Permalänk
Inaktiv

Vilken typ av kryptering ska man använda för användarna och vad ska man välja i databasen när det kommer till att importera uppgifter?

Hej. Jag har helt glömt vilket man brukade använda när man krypterade lösenord från sign-up form som sen läggs in i databasen. Vad jag minns så brukade det vara Sha1 eller AES, ni kanske använder något annat som är mycket starkare idag? Tipsa gärna om vilka och jag använder PHP.

Sen undrar jag i databasen, i columerna, sätter man VARCHAR eller TEXT där för lösenord och andra uppgifter som telefonnummer, användarnamn med mera?

Permalänk
Medlem

Det vanliga är väl att använda hash med salt, och använda en hash-funktion som t.ex. SHA256. SHA1 har däremot varit föråldrad i runt 10 år eller så, medan AES är en krypteringsalgoritm och inte en hash-funktion.

Permalänk
Medlem

Lösenord ska inte krypteras, de ska hashas. Distinktionen är viktig: ett krypterat lösenord kan avkrypteras med rätt nyckel, medan en hashfunktion är s.k. "one way", det finns inget sätt att återfå indatan. För att kontrollera om en användare skrivit in rätt lösenord så hashar du det denne skriver in och jämför med hashen i databasen. Därav är SHA1 på rätt väg, men den är att anses som "typ knäckt" och bör inte användas i detta syfte.

Hashen ska även saltas med ett slumpat salt för att mitigera bla rainbow table-attacker.

Hashen får heller inte vara för snabb ellet variera i exekveringstid beroende på indata, då är den öppen för timing-attacker.

Summerat: att "spara lösenord" är djävulskt komplicerat och lätt att göra fel. Implementera inget själv, använd istället något vedertaget bibliotek som implementerar bcrypt eller liknande saltad hashfunktion.

Permalänk
Inaktiv
Skrivet av SimpLar:

Lösenord ska inte krypteras, de ska hashas. Distinktionen är viktig: ett krypterat lösenord kan avkrypteras med rätt nyckel, medan en hashfunktion är s.k. "one way", det finns inget sätt att återfå indatan. För att kontrollera om en användare skrivit in rätt lösenord så hashar du det denne skriver in och jämför med hashen i databasen. Därav är SHA1 på rätt väg, men den är att anses som "typ knäckt" och bör inte användas i detta syfte.

Hashen ska även saltas med ett slumpat salt för att mitigera bla rainbow table-attacker.

Hashen får heller inte vara för snabb ellet variera i exekveringstid beroende på indata, då är den öppen för timing-attacker.

Summerat: att "spara lösenord" är djävulskt komplicerat och lätt att göra fel. Implementera inget själv, använd istället något vedertaget bibliotek som implementerar bcrypt eller liknande saltad hashfunktion.

Alright. Har du en bra tutorial från php.net eller någon sidan man kan använda sig av?

Permalänk
Medlem
Skrivet av anon338341:

Alright. Har du en bra tutorial från php.net eller någon sidan man kan använda sig av?

PHP är inget jag har pysslat med, men en enstaka sökning "php hash password" visade att bcrypt finns i standardbiblioteket: https://www.php.net/manual/en/function.password-hash.php

Läs dokumentationen där så ser du hur saltet fungerar by default (bäddas in i hashen), och så hittar du även verifieringsfunktionen som enkelt jämför ett lösenord i klartext med en hash. Hashen sparar du i databasen, lösenordet självt sparar du aldrig.

I princip är det så enkelt om man använder färdiga bibliotek för lösenordshashning. Det kan dock finnas någon implementeringsspecifik fallgrop som jag inte känner till här, så om jag var du skulle jag söka runt lite på nätet om att använda dessa funktioner på bästa sätt (samt om folk tycker de anses vara väl implementerade).

Som sagt har jag aldrig rört PHP, så ta inte mitt ord för något här utan använd det bara som utgångspunkt för att finna rätt information.

Permalänk
Medlem

Du kan använda VARCHAR (255) och password_hash('password', PASSWORD_DEFAULT);