webForumDet fria alternativet

Kryptering av användar data

10 svar · 716 visningar · startad av startail

startailMedlem sedan sep. 2000159 inlägg
#1

Hej,

Jag har en fråga angående kryptering av användar data.
Mina användare kommer att spara känslig information och jag själv anser att detta då borde vara krypterat för användarens bästa. Men frågan är hur det skall gå till för att bli så säkert som möjligt.
Jag har ingen tidigare erfarenhet av kryptering av data i php.

Min första känsla av hur man kan göra är att man krypterar allting i databasen med hjälp av användarens egna lösenord, vilket är något ingen annan känner till eller som finns sparat på sidan/servern/databasen då detta bara sparas med hjälp av MD5+salt.

Själva funktionen för kryptering är jag inte helt säker på vad som är smidigast, eller säkrast.

Men några tips och förslag vore bra så jag kan undgå att klanta till det :stud

SPiNMedlem sedan mars 20005 832 inlägg
#2

Vad använder du för dbms? Eftersom att vi hamnade i PHP-forumet gissar jag på MySQL. MySQL har en inbyggd funktion för SHA, närmare bestämt SHA1(). Som salt brukar jag använda en slumpad sträng på runt 6 tecken som lagras i databasen, samt två statiska tecken som läggs till i koden på saltet. Ett exempel:

Tabellen Users har fyra fält: UserId, UserName, UserPwd, UserSalt.

Vi har två funktioner i PHP, den ena skapar ett lösenord och den andra ett salt:

function generateSalt() {
	$saltchars = "abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	srand();
	for($i = 0; $i < 6; $i++) {
		$salt .= substr($saltchars, rand() % strlen($saltchars), 1);
	}

	return $salt;
}

function generatePassword() {
	$pwdchars = "abcdefghijklmnopqrstuvwxyz:;_-[]ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	srand();
	for($i = 0; $i < 8; $i++) {
		$password .= substr($pwdchars, rand() % strlen($pwdchars), 1);
	}

	return $password;
}

När du lägger in en användare i tabellen:

$userName = "Per I. Skåpet";
$userPwd = generatePassword();
$userSalt = generateSalt();

$pdh = new PDO(...);
$stmt = $pdh->prepare("INSERT INTO Users (UserName, UserPwd, UserSalt) VALUES(:uname, SHA1(CONCAT(:upwd, :usalt+':-')), :usalt)");
$stmt->bindParam(":uname", $userName);
$stmt->bindParam(":upwd", $userPwd);
$stmt->bindParam(":usalt", $userSalt);
$stmt->execute();
...

När en användare loggar in:

$pdh = ...
$stmt = $pdh->prepare("SELECT UserId FROM Users WHERE UserName=:uname AND UserPwd=SHA1(CONCAT(:upwd, Users.UserSalt+':-'))");
...
startailMedlem sedan sep. 2000159 inlägg
#3

Jag använder MySQL som databas, ja.

SHA1 funktionen kanske är något att kolla på då ja.

Är jag helt fel ute om jag tycker att det verkar osäkert att ha userSalt inskrivet i databasen? Vist, om de som kommer åt databasen bara kommer åt den och inte koden över hur jag har krypterat databasen, så är det nog inte så farligt.

Dock, vad jag kom att tänka på att man kan använda som kryptering sträng är ett MD5 (eller liknande) utav användarID och användar lösen. Så när någon byter lösenord så generars krypteringssträngen om och datan krypteras om till den nya strängen.

SPiNMedlem sedan mars 20005 832 inlägg
#4

Nej, det är inte bättre. Det är bättre att ha ett separat salt som inte beror på något annat fält i databasen. På så sätt skyddar man sig bättre mot regnbågstabeller, eftersom att färre regnbågstabeller behövs när "inbrytaren" inser att hashen enbart beror på ett annat fält i tabellen.

MySQL har även en MD5()-funktion, den fungerar bra den också.

TroxyMedlem sedan mars 20041 508 inlägg
#5

Nu måste vi hålla isär begreppen här...
En kryptering går att avkryptera med en nyckel. En hash (MD5, SHA1 mfl...) går ej att avläsa.
Vill du kryptera eller hasha informationen?
Dvs. ska användarna kunna läsa informationen igen?
Allt beror på vad det är för typ av data.
Är det lösenord så är det hash du ska använda.

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#6

För alternativet kryptering borde GnuPG funka..
http://devzone.zend.com/node/view/id/1265

För hashing, ja, där har vi ju svaren redan:
md5, sha1, sha2 osv..

SPiNMedlem sedan mars 20005 832 inlägg
#7

Helt riktigt Troxy. Kryptering sker (oftast) på själva kopplingen mellan klient och server, via SSL. Lösenord hashar man, endast persistent data ska krypteras. (I det här fallet tyckte jag att det var uppenbart att det var hash som det var fråga om :))

TroxyMedlem sedan mars 20041 508 inlägg
#8

SPiN skrev:

(I det här fallet tyckte jag att det var uppenbart att det var hash som det var fråga om :))

Hehe hoppas att jag inte uppfattades som en besserwisser. :e
Jag blev bara orolig ifall startail ville kryptera ex. inlägg eller artiklar och började göra om textmassor till MD5-strängar. Då hade det blivit tråkigt :P

startailMedlem sedan sep. 2000159 inlägg
#9

Jag syftar på en mängd data som skall krypteras (ej hashas) i databasen, och som senare skall dekrypteras åt användaren när denne läser den.

Så MD5, SSH1 osv är inte det jag letar efter.

Hashning har jag redan på användar lösen med ett MD5 och ett data oberoende salt som man mycket riktigt skall göra. :birp

SPiNMedlem sedan mars 20005 832 inlägg
#10

Åh, jag läste inte riktigt riktigt - jag fick intrycket av att du ville lagra lösenord i databasen på ett säkert sätt. Sorry!

Tyvärr stödjer inte PHP per default någon två-vägs krypteringsalgoritm - men om du har kontroll själv över servern eller kan åtminstone påverka vilka extensions till PHP som finns tillgängliga rekommenderar jag att kompilera om PHP med MCrypt. I och med färdiga funktioner för mcrypt i PHP rekommenderar jag det framför Fredde Mannens förslag, som använder tredjeparts programvara genom shell-använding.

startailMedlem sedan sep. 2000159 inlägg
#11

Jag har kontroll på servern så jag kan alltid kolla in MCrypt.

Får läsa på litegranna.

Genererad på 381 ms · cache AV · v20260730165559-full.f96bc7eb