Övrigt Kryptering
MD5, SHA1, BCRYPT
Ibland är det viktigt att vi kan kryptera vissa delar. Ibland större textstycken, ibland filer men oftast är det lösenord som vi använder det på. När vi skapade vårt tidigare inloggningssystem så sparade vi lösenorden rakt upp och ner i databastabellen. Det normala är vi envägskrypterar lösenordet, det vill säga vi spar en hashad text som grundar sig på lösenordet. Det finns många olika sätt att göra detta. Tidigare kända hash algoritmer är md5, sha1. Tyvärr är de långifrån säkra idag. Med hjälp av datorkapacitet och till exempel databaser med många miljoner hashade ord så kan de lätt bli bakåtkrypterade.
Bcrypt är den bästa algoritmen idag i PHP. I framtida versioner, kan den komma att bli uppdaterad till en ännu bättre än den som finns idag. Den kan också bli justerad om det framkommer något problem i den. Därför rekommenderas att vi spar den i en VARCHAR(255) kolumn, ifall framtida algoritmer ökar hash-längden.
Exempel:
OBS! Vi ser att md5 och sha1, har samma hashade krypteringssträng medan bcrypt varierar från gång till gång. Bcrypt är den just nu bästa och har implementerats i PHP 5.5. Bcrypt är en långsam algoritm som kräver mycket datorkapacitet, vilket är ett verktyg mot "Brute Force"-attacker.
Vi använder, password_hash($ord, PASSWORD_DEFAULT) för att kryptera och
password_verify($ord, $xmyhash) som checkar att en viss kryptering stämmer med ett visst ord.
MD5 ger en sträng på 32 tecken.
SHA1
ger en teckensträng på 40 tecken.
Bcrypt en teckensträng på 60 tecken. Till exempel:$2y$10$3UFXhyEizCYFbM.MDBlgYeci/pAYwoxfVk/UEyGF7oH6NuVlGrFeu där $2y anger krypteringsalgoritm, $10 anger hur mycket datorkraft som ska krävas (1-31 med 10 som default), sen kommer ett $-tecken med 22 tecken "salt" och 31 tecken "hashkod".
<?php
if(isset($_POST['ord']) && $_POST['ord']!="")
{
$ord=htmlspecialchars($_POST['ord']);
$_POST['ord']="";
$md5kod= md5($ord);
echo "Ordet:\t".$ord."<br><br>";
echo "I md5-form:\t<strong>".$md5kod."</strong><br><br>";
$sha1kod= sha1($ord);
echo "I shal-form:\t<strong>".$sha1kod."</strong><br><br><br>";
$sha512kod= hash("sha512",$ord);
echo "I sha512-form:\t<strong>".$sha512kod."</strong><br><br>";
$hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
$test = crypt("password", $hash);
$pass = $test == $hash;
echo "Kolla om bcrypt-biblioteket fungerar: <strong>" . ($pass ? "JA" : "NEJ")."</strong>";
echo "<br><br>";
$myhash = password_hash($ord, PASSWORD_DEFAULT);
echo "Bcrypt-form:\t<strong>".$myhash."</strong><br><br>";
$xmyhash="$2y$10$3M6jarS4OWZW37HLksrTXOMpWSmDr/Xo7cqxReV1F6WwbSCluDy/K";
if (password_verify($ord, $xmyhash)) {
echo "Passera!<br><br>";
} else {
echo "Ajajajaj!<br><br>";
}
}
?>
<br><br><br>
<fieldset><legend>Lösenordstest</legend>
<form method="post" action="">
<br>
Skriv ett ord:<br><input type="text" name="ord"><br>
<button type="submit">Testa</button>
</form>
</fieldset>
</body>
Källor, referenser, bra länkar
https://github.com/ircmaxell/password_compat
Webbserverprogrammering 1, Thelin Läromedel, Lars Gunther 2013
http://en.wikipedia.org/wiki/Bcrypt