Permalänk
Medlem

"kryptera" mysql lösenord?

Hej! Har nu lärt mig lite mysql och php. Så jag kom att tänka på: hur "krypterar" man lösenordet på databasen? Ett exempel:

$password = 'test';
$host = 'test';
$username = ' test';

Då skulle nån ju bara kunna kolla källkoden och ansluta sig till min mysql bas... så ja, hur "krypterar" man lösenordet?( möjligtvis ert andra också men först lösenordet) har googlat men fick inge bra svar.

Tack i förväg!

Skickades från m.sweclockers.com

Visa signatur

Alea iacta est.
(mest för att det låter coolt)

Coola kids kan aldrig dö men för mig kan dom göra ett undantag.

Permalänk
Medlem

http://en.wikipedia.org/wiki/Client-side_scripting vs http://en.wikipedia.org/wiki/Server-side_scripting

Hehe, har du någonsin försökt att hitta din PHP kod genom visa källkod? Då märker du ganska snabbt att du inte ser någon php överhuvudtaget. Detta beror på att PHP endast kommunicerar med servern och når därför aldrig användarens webbläsare. Därför behöver man inte heller kryptera användarnamnet och lösenordet. Enda scenariot jag kan tänka mig är om någon skulle komma åt din webbserver och plocka ner filerna. Men då är det ju redan ganska kört..

Permalänk
Medlem

Hehe... faktiskt inte :/ har inte tänkt på det... Sjä, tack for ditt svar!:)

Skickades från m.sweclockers.com

Visa signatur

Alea iacta est.
(mest för att det låter coolt)

Coola kids kan aldrig dö men för mig kan dom göra ett undantag.

Permalänk
Medlem

Tycker ändå det är värt att köra kryptering, skadar ju knappast?
Du kan ju köra med t.ex. hash ('sha256', $password);

Annars brukar jag använda nån kod som liknar det här för att hasha:

function generate_string ($minimum_length, $maximum_length) { // Array containing different characters $chars = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '.', '@', '%', '&', '/', '[', ']', '-', '#', '(', ')', '=', '\\', '{', '}', '?', '+', '€', '$', '^', '£', '<', '>', '|', ',', '*'); $size = count ($chars); // Count amount of characters $string = ''; $length = mt_rand ($minimum_length, $maximum_length); // Get a random length // Now build a string of random characters for ($i=1; $i<=$length; $i++) { $string .= $chars[mt_rand(0, $size - 1)]; } return $string; } function hash_password ($password, $salt) { // Split the password in two, and have the salt between those two (increases security) $string_length = round (strlen ($password) / 2); $password_and_salt = substr ($password, $string_length) . $salt . substr ($password, 0, $string_length); return hash ('sha512', $password_and_salt); // And now hash it, using a strong hash like sha512, sha256 or whirlpool } $salt = generate_string (16, 32); $hashed_password = hash_password ($password, $salt);

Salt läggs till själva lösenordet för att förstärka säkerheten.

Säger inte att det krävs så här kraftig kryptering, eller om ens något, men det är en god vana som knappast skadar.

Permalänk
Inaktiv
Skrivet av Snacker:

Tycker ändå det är värt att köra kryptering, skadar ju knappast?
Du kan ju köra med t.ex. hash ('sha256', $password);

Annars brukar jag använda nån kod som liknar det här för att hasha:

function generate_string ($minimum_length, $maximum_length) { // Array containing different characters $chars = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '.', '@', '%', '&', '/', '[', ']', '-', '#', '(', ')', '=', '\\', '{', '}', '?', '+', '€', '$', '^', '£', '<', '>', '|', ',', '*'); $size = count ($chars); // Count amount of characters $string = ''; $length = mt_rand ($minimum_length, $maximum_length); // Get a random length // Now build a string of random characters for ($i=1; $i<=$length; $i++) { $string .= $chars[mt_rand(0, $size - 1)]; } return $string; } function hash_password ($password, $salt) { // Split the password in two, and have the salt between those two (increases security) $string_length = round (strlen ($password) / 2); $password_and_salt = substr ($password, $string_length) . $salt . substr ($password, 0, $string_length); return hash ('sha512', $password_and_salt); // And now hash it, using a strong hash like sha512, sha256 or whirlpool } $salt = generate_string (16, 32); $hashed_password = hash_password ($password, $salt);

Salt läggs till själva lösenordet för att förstärka säkerheten.

Säger inte att det krävs så här kraftig kryptering, eller om ens något, men det är en god vana som knappast skadar.

Om nu någon får tag på php filen kvittar det ju om du kör hash() på det eller inte innan du ansluter till databasen, lösenordet står ju fortfarande i filen...

Permalänk
Medlem

Till att börja med så är sha256 också en metod för hashning.
Hashning innebär att: givet en serie av data, godtyckligt lång, producera en ny serie av data med en bestämd längd på ett sådant sätt att man minimerar risken att få kollision (strängen "test" hashas kanske till "b0c3", man vill då helst inte att "hejsan hoppsan" ska hashas till "b0c3" också), det ska vara svårt att göra motsatsen (dvs givet "b0c3" lista ut att inkommande sträng var just "test"). Vidare så vill man att det ska gå snabbt att räkna ut en hash. En till önskvärd egenskap är att en liten ändring i den inkommande datan ska generera en stor förändring i hashen (t.ex. så är dett bra: "test" ==> "b0c3", "tess" ==> "19fc" medans om säg "tess" hade hashats till "b0c2" så hade det varit illa).

Som du kanske märker så är det omöjligt att undgå krockar. Om du har en hash med 256 bitars längd så motsvarar detta ca 1.2*10^77 olika kombinationer. Detta kan du ju jämföra med låt säga hashning av textdokument (som bara inneåller små och stora bokstäver samt siffror, dvs ca 66 olika tecken) med en längd på 42 tecken, redan antalet av sådana dokument blir 1.7*10^78. Alltså VET vi att hashning av alla möjliga 42-teckens-dokument kommer att leda till en krock (någon gång, någon stans) sannolikheten är liten, men den finns. Men nu hashas ju inte enbart 42-teckens-dokument utan det är godtycklig längd, så ATT det någon gång krockar är oundvikligt man vill dock minimera sannolikheten för en krock.

Det hashning skyddar mot direkt är att någon skulle komma åt din databas med användaruppgifter och lösenord. Om dessa finns i klartext så är det ju redan kört men om alla lösenord är hashade så har tjyven följande problem att lösa:
HASH( password ) = lösenord-lagrat-i-databasen, han/hon måste alltså finna ett sätt att gå från det lagrade lösenordet till det som användarn valde, password. Men detta var ju precis ett av kriterierna för en hash-funktion, svårt att gå tillbaka.

Gällande inloggningen till den faktiska databasen där du var orolig för lösenord och användarnamn kan jag bara ge följande råd:
1) Skapa individuell användare i databasen som bara har rätt att hantera den specifika databasen/databaserna för applikationen i fråga
2) Lås ner möjligheterna att logga in från externa siter genom att kräva att denna användare bara får logga in via localhost (den egna maskinen)

Lycka till med allt

Visa signatur

weeeee

Permalänk
Medlem
Skrivet av Snacker:

Tycker ändå det är värt att köra kryptering, skadar ju knappast?
Du kan ju köra med t.ex. hash ('sha256', $password);

Annars brukar jag använda nån kod som liknar det här för att hasha:

function generate_string ($minimum_length, $maximum_length) { // Array containing different characters $chars = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '.', '@', '%', '&', '/', '[', ']', '-', '#', '(', ')', '=', '\\', '{', '}', '?', '+', '€', '$', '^', '£', '<', '>', '|', ',', '*'); $size = count ($chars); // Count amount of characters $string = ''; $length = mt_rand ($minimum_length, $maximum_length); // Get a random length // Now build a string of random characters for ($i=1; $i<=$length; $i++) { $string .= $chars[mt_rand(0, $size - 1)]; } return $string; } function hash_password ($password, $salt) { // Split the password in two, and have the salt between those two (increases security) $string_length = round (strlen ($password) / 2); $password_and_salt = substr ($password, $string_length) . $salt . substr ($password, 0, $string_length); return hash ('sha512', $password_and_salt); // And now hash it, using a strong hash like sha512, sha256 or whirlpool } $salt = generate_string (16, 32); $hashed_password = hash_password ($password, $salt);

Salt läggs till själva lösenordet för att förstärka säkerheten.

Säger inte att det krävs så här kraftig kryptering, eller om ens något, men det är en god vana som knappast skadar.

Tack för koden! Men säger som Havsmonstret gjorde, lösenordet står ju fortfarande i filen....

Skrivet av mounte:

Till att börja med så är sha256 också en metod för hashning.
Hashning innebär att: givet en serie av data, godtyckligt lång, producera en ny serie av data med en bestämd längd på ett sådant sätt att man minimerar risken att få kollision (strängen "test" hashas kanske till "b0c3", man vill då helst inte att "hejsan hoppsan" ska hashas till "b0c3" också), det ska vara svårt att göra motsatsen (dvs givet "b0c3" lista ut att inkommande sträng var just "test"). Vidare så vill man att det ska gå snabbt att räkna ut en hash. En till önskvärd egenskap är att en liten ändring i den inkommande datan ska generera en stor förändring i hashen (t.ex. så är dett bra: "test" ==> "b0c3", "tess" ==> "19fc" medans om säg "tess" hade hashats till "b0c2" så hade det varit illa).

Som du kanske märker så är det omöjligt att undgå krockar. Om du har en hash med 256 bitars längd så motsvarar detta ca 1.2*10^77 olika kombinationer. Detta kan du ju jämföra med låt säga hashning av textdokument (som bara inneåller små och stora bokstäver samt siffror, dvs ca 66 olika tecken) med en längd på 42 tecken, redan antalet av sådana dokument blir 1.7*10^78. Alltså VET vi att hashning av alla möjliga 42-teckens-dokument kommer att leda till en krock (någon gång, någon stans) sannolikheten är liten, men den finns. Men nu hashas ju inte enbart 42-teckens-dokument utan det är godtycklig längd, så ATT det någon gång krockar är oundvikligt man vill dock minimera sannolikheten för en krock.

Det hashning skyddar mot direkt är att någon skulle komma åt din databas med användaruppgifter och lösenord. Om dessa finns i klartext så är det ju redan kört men om alla lösenord är hashade så har tjyven följande problem att lösa:
HASH( password ) = lösenord-lagrat-i-databasen, han/hon måste alltså finna ett sätt att gå från det lagrade lösenordet till det som användarn valde, password. Men detta var ju precis ett av kriterierna för en hash-funktion, svårt att gå tillbaka.

Gällande inloggningen till den faktiska databasen där du var orolig för lösenord och användarnamn kan jag bara ge följande råd:
1) Skapa individuell användare i databasen som bara har rätt att hantera den specifika databasen/databaserna för applikationen i fråga
2) Lås ner möjligheterna att logga in från externa siter genom att kräva att denna användare bara får logga in via localhost (den egna maskinen)

Lycka till med allt

Tack så mycket! Jag hänger med på det du skrev, så nu förstår jag det bättre!

Visa signatur

Alea iacta est.
(mest för att det låter coolt)

Coola kids kan aldrig dö men för mig kan dom göra ett undantag.

Permalänk
Medlem
Skrivet av anon150287:

Om nu någon får tag på php filen kvittar det ju om du kör hash() på det eller inte innan du ansluter till databasen, lösenordet står ju fortfarande i filen...

Om man använder metoderna jag skrev ovan och ingen modifierar filerna blir brute force enda sättet att ta reda på dem. Då gäller det i slutändan att användaren valt ett starkt lösenord och att man har en långsam hashmetod.

Ifall det värsta händer och nån får tillgång till alla hashade lösenord, är det säkrare med långsamma hashmetoder då det tar längre tid att få reda på det riktiga lösenordet.

Du bör alltså se till att användarna har ett någorlunda starkt lösenord, och att allt saltas och hashas med bra metoder.

EDIT: Sorry! Var trött när jag skrev båda svaren och läste frågan. Läste fel och tar tillbaka allt
Trodde du ville kryptera en användares lösenord xD

Skickades från m.sweclockers.com

Permalänk
Medlem

Jag lånar tråden här Om jag vill kryptera användarens lösenord så det inte visas i klartext i databasen ifall nån skulle komma åt den. Hur skriver man en sån kod att när folk registrerar sig så krypteras lösenordet i databasen? Vilket är det starkaste och stabilaste sättet att göra det här?

Jag är väldigt ny inom det här och försöker bara lära mig. Har inte så bra koll på sånt här.

Permalänk
Medlem
Skrivet av K.L:

Jag lånar tråden här Om jag vill kryptera användarens lösenord så det inte visas i klartext i databasen ifall nån skulle komma åt den. Hur skriver man en sån kod att när folk registrerar sig så krypteras lösenordet i databasen? Vilket är det starkaste och stabilaste sättet att göra det här?

Jag är väldigt ny inom det här och försöker bara lära mig. Har inte så bra koll på sånt här.

Du vill nog inte kryptera lösenordet, finns ju ingen mening för dig att kunna bakvänt ta fram användarnas lösenord igen.

Det du vill göra är att ta lösenordet som användaren väljer, hasha (och eventuellt salta) detta och sedan sätta in den hashade versionen i databasen. När användaren sedan loggar in så jämför du en hashad version av det användaren matat in för inloggning med det du har i databasen.

Finns en mängd olika hashningsalgoritmer att välja på, vissa såklart starkare än andra.

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Medlem
Skrivet av matti4s:

Du vill nog inte kryptera lösenordet, finns ju ingen mening för dig att kunna bakvänt ta fram användarnas lösenord igen.

Det du vill göra är att ta lösenordet som användaren väljer, hasha (och eventuellt salta) detta och sedan sätta in den hashade versionen i databasen. När användaren sedan loggar in så jämför du en hashad version av det användaren matat in för inloggning med det du har i databasen.

Finns en mängd olika hashningsalgoritmer att välja på, vissa såklart starkare än andra.

Ok. Då är det hasha jag menar. Vet iaf inte hur jag ska gå tillväga för och göra det samt vilket som blir starkast. Hoppas nån vänlig själ orkar visa hur det går till

Permalänk
Medlem
Skrivet av K.L:

Ok. Då är det hasha jag menar. Vet iaf inte hur jag ska gå tillväga för och göra det samt vilket som blir starkast. Hoppas nån vänlig själ orkar visa hur det går till

Använd tex sha256 för att hasha och ta en slumpad sträng som salt. Ännu bättre blir det om du gör ett unikt salt för varje användare.

Skickades från m.sweclockers.com

Visa signatur

Intel i7 2600K @ 4.5GHz | GeForce GTX 680 | ASUS P8P67 PRO | Corsair Dominator 16GB 1600MHz | Samsung 830 256GB

Permalänk
Medlem

MD5 kanske?

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <?php if (isset($_POST['submit'])) { $username = $_POST['username']; $password = $_POST['password']; if ($username&&$password) { $securePassword = md5($password); // Anslut till databas och kolla om om $securePassword finns som MD5 echo ' Det lösenord du skrev: <strong>'. $password .'</strong> <br> Det lösenord du skrev, fast i MD5: <strong>'. $securePassword .'</strong> '; } else { // Fel lösenord echoas här echo ' Det lösenord du skrev: '. $password .' <br> Lösenordet du skrev i MD5: '. $securePassword .' '; } } else { echo ' <p>Log in to the website</p> <form action="index.php" method="POST"> <input type="username" placeholder="Your username" name="username"> <br> <input type="password" placeholder="Your password" name="password"> <br> <br> <input type="submit" name="submit" value="Log in"> </form> '; } ?>

Permalänk
Medlem
Skrivet av BLundFtw:

MD5 kanske?

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <?php if (isset($_POST['submit'])) { $username = $_POST['username']; $password = $_POST['password']; if ($username&&$password) { $securePassword = md5($password); // Anslut till databas och kolla om om $securePassword finns som MD5 echo ' Det lösenord du skrev: <strong>'. $password .'</strong> <br> Det lösenord du skrev, fast i MD5: <strong>'. $securePassword .'</strong> '; } else { // Fel lösenord echoas här echo ' Det lösenord du skrev: '. $password .' <br> Lösenordet du skrev i MD5: '. $securePassword .' '; } } else { echo ' <p>Log in to the website</p> <form action="index.php" method="POST"> <input type="username" placeholder="Your username" name="username"> <br> <input type="password" placeholder="Your password" name="password"> <br> <br> <input type="submit" name="submit" value="Log in"> </form> '; } ?>

Att bara köra MD5 på lösenordet innan det lagras i databasen är inte att rekommendera. (om man ens ska använda MD5 över huvudtaget?)
Det måste på en salt (gärna 2, en unik per användare och en gemensam för alla) för att lösenorden ska vara hyffsat säkra. En förvrängning av lösenordet är inte heller helt fel.

Permalänk
Medlem

Alltså jag tolkar den ursprungliga frågan som att den rör användarnamn och lösenord på den användare på systemet som ansluter till mysql. Dvs, det lösenord han pratar om är det som krävs för att han skall kunna koppla upp sin applikation mot sin mysql databas. Inte användarnas enskillda lösenord. Rätta mig om jag har fel.

Om detta är vad det handlar om så finns det inget "inbyggt" i PHP/MySQL för att göra detta. Utan MySQL behöver användarnamn och lösenord av dig. Du skulle kunna skapa en liten applikation som fungerar som en pipe och som du har någon form av kryptering mellan som den kan avkryptera och ansluta mot MySQL och sedan går all kommunikation genom den mellan din applikation och databasen. Dock rätt rörigt.

Se bara till att din server är så säker som möjligt, kör inte anslutningen från din applikation till databasen som root eller någon annan användare med mer priviliegier än just din applikation kräver osv. Tar du dagliga backuper på applikationens databas då så är du iaf lite skyddad om något skulle hända och någon kommer åt lösenordet. I så fall tappar du MAX en dag, ingen annan databas påverkas då det inte finns privilegier att pilla på dem och du kan sedan luska ut hur någon kom över lösenordet, täppa till det hålet och återställa din backup.

Visa signatur

Huvudriggen är en Gigabyte Aorus Xtreme | 128gb DDR5 6000 | Ryzen 7950X | 3080Ti
Utöver det är det för många datorer, boxar och servar för att lista :P

Permalänk
Medlem
Skrivet av BLundFtw:

MD5 kanske?

...

MD5 går att knäcka och lösenord ska ju inte kunna ses av andra, eller hur? Whirlpool däremot är (vad jag vet) än i dag oknäckbar, så jag rekommenderar den hash-tekniken framför ditt val. Jag vet inte hur många lösenord som har spridits i klartext, på grund av mitt val av MD5 som hash-teknik -.-

hash('Whirlpool', 'mitt-losenord');

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me /device:desktop. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Medlem

SHA-3 , låter intressant däremot är det rena grekiskan för min del
http://csrc.nist.gov/groups/ST/hash/sha-3/sha-3_standardizati...

Permalänk
Medlem

Det går att få fram lösenordet för alla algoritmer för eller senare. Det viktiga är att välja en hash algoritm vars kryptoanalytiska komplexitet är så hög att den är så gott som dessa som vad man skulle ha vid "exhaustive search".

Helst ska även algoritmen vara långsam så det ska tar tid att prova sig fram också.
MD5, SHA-1,2,3, osv är alla designade för att vara snabba. Vilket gör dem mindre lämnade för lösenord.

Förslagvis används en långsammare algoritm t.ex. bcrypt (standard för http://php.net/manual/en/function.password-hash.php) eller PBKDF2 (http://php.net/manual/en/function.hash-pbkdf2.php). Det tredje alternativet är att bara göra det väldigt drygt att prova sig fram till lösenordet genom att göra det genom samma algoritm flera gånger.

T.ex. ta lösenordet genom SHA-1 10000 gånger, samt använd ett unikt "salt" för varje lösenord så att förgenererade ordböcker (https://en.wikipedia.org/wiki/Rainbow_table) blir värdelösa.

Angående orginalfrågan med inloggningsuppgifterna för mysql:

Så skriv dem i en separat fil. Lägg denna utanför www root katalogen för sidan och sätt rättigheten så det bara är ägaren som får läsa filen, se sedan till att webservern kör sajten som den ägaren.

t.ex. om wwwrooten är /srv/www/domain.com/web lägg dina inloggninguppifter i /srv/www/domain.com/mysql-connection-params.php eller något. och se till att ingen annan än ägaren får läsa den.