Jump to content
Unity Insider Forum

PlayerPrefs verschlüsseln


damuddamc

Recommended Posts

Da ich mal davon ausgehe das viele von euch die PlayerPrefs verwenden will ich hier mal nen kleines Script von mir posten welches die PlayerPrefs auf eine sehr einfache Weise verschlüsselt um es nicht jedem zu erlauben gespiecherte Werte zu ändern!

 

Die PlayerPrefs liegen dummerweise als XML immer im Dateipfad und sind daher auch für Laien einfach zu verändern... grad dann ärgerlich wenn man nen Goldwert oder Heighscores speichert...

 

Ich hoffe das Script hilft dem einen oder anderen!

 

 

Anwendung:

//Speichern einen Integers Beispielsweise
SWPlayerPrefs.SetInt("Gold",1000);
//Laden des Integers
SWPlayerPrefs.GetInt("Gold");
//oder mit Default Value
SWPlayerPrefs.GetInt("Gold",0);
//Abfragen ob Vorhanden
if( SWPlayerPrefs.HasKey("Gold") ){
//Anweisung
}
//Speichern
SWPlayerPrefs.Save();
//Key Löschen
SWPlayerPrefs.DeleteKey("Gold");
//Alles Löschen
SWPlayerPrefs.DeleteAll();

 

Wie ihr seht ändert sich an sich nichts, ihr habt die gleichen Möglichkeiten wie immer nur das ihr statt "PlayerPrefs" nun "SWPlayerPrefs" nehmen müsst!

 

SWPlayerPrefs.cs

using UnityEngine;
using System.Collections;
using System.Text;
using System;
public class SWPlayerPrefs {


public static void SetString(string key, string value){

 string encodedKey = Encrypt(key);

 string encodedValue = Encrypt( value );


 PlayerPrefs.SetString(encodedKey,encodedValue);
}

public static string GetString(string key){
 return GetString(key,"");
}

public static string GetString(string key,string defaultValue){
 string encodedKey = Encrypt(key);
 string encodedDefault = Encrypt(defaultValue);
 return Decrypt( PlayerPrefs.GetString( encodedKey,encodedDefault )) ;

}


public static void SetFloat(string key, float value){

 SetString(key,value.ToString());
}
public static float GetFloat(string key){

 return float.Parse( GetString(key,"0") );
}
public static float GetFloat(string key,float defaultValue){

 return float.Parse( GetString(key,defaultValue.ToString()) );
}

public static void SetInt(string key, int value){

 SetString(key,value.ToString());
}

public static int GetInt(string key){

 return int.Parse(GetString(key,"0") );
}
public static int GetInt(string key,int defaultValue){

 return int.Parse(GetString(key,defaultValue.ToString()) );
}
public static void SetBool(string key, bool value){

 SetString(key,value.ToString());
}
public static bool GetBool(string key){

 return bool.Parse(GetString(key,false.ToString()) );
}
public static bool GetBool(string key,bool defaultValue){

 return bool.Parse(GetString(key,defaultValue.ToString()) );
}


public static bool HasKey(string key){
 string encodedKey = Encrypt(key);
 return PlayerPrefs.HasKey( encodedKey );
}

public static void Save(){
 PlayerPrefs.Save();
}

public static void DeleteKey(string key){
 string encodedKey = Encrypt(key);
 PlayerPrefs.DeleteKey(encodedKey);
}

public static void DeleteAll(){
 PlayerPrefs.DeleteAll();
}


public static string Encrypt (string toEncrypt)
{
 string encoded = toEncrypt;

 byte[] bytesToEncode = Encoding.UTF8.GetBytes (toEncrypt);
 encoded = Convert.ToBase64String (bytesToEncode);

 return encoded;
}

public static string Decrypt (string toDecrypt)
{
 string decoded = toDecrypt;


	byte[] decodedBytes = Convert.FromBase64String (toDecrypt);
 decoded = Encoding.UTF8.GetString (decodedBytes);

 return decoded;
}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

jo deshalb hab ich auch geschrieben "einfach" :) is mir klar dass das alles andere als sicher ist... du erkennst das vlt sofort als B64 aber nicht jeder Laie.. und is wohl besser die Daten überhaupt irgendwie unleserlich zu machen als die XML einfach so rumliegen zu lassen und jeder Depp kann auf den ersten Blick erkennen was da gespeichert ist... das wäre dann gefährlich, an der Verwendung von B64 kann ich nichts gefährliches erkennen bei dem man vorsichtig sein sollte....

 

Für was B64 eigentlich verwendet wird ist an dieser Stelle ja vollkommen egal... Verschlüsselung ist da vlt. der falsche Begriff wenn mans ganz genau nimmt ist es eine Codierung....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit vorsicht meint er garantiert nur, dass man sich nicht sicher fühlen soll.

Denn wie Marrk schon schreibt und du selber weisst, ist das entschlüsseln nicht soo schwer.

 

Ich finde jedoch jede kleine Verschlüsselung besser als gar keine. Und wenn da nicht gleich das Wort "Gold" auszumachen ist, hat es 99% aller Spieler schon abgehalten zu cheaten. ;)

Von daher ist dein Script schon eine gute Hilfe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 month later...

Ja das kann gut sein, wollte dich auch nicht schlechtreden, bzw deinen Aufwand klein machen.

 

AES Verschlüsselung kann man sich aber auch selbst implementieren, ist natürlich mit Aufwand verbunden, zum Glück gibts aber bereits gute Beispiele dafür, nur falls es jemanden noch interessieret:

 

http://www.codeproject.com/Articles/18288/Simple-Cryptographer-Simple-DES-AES-Implementation

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hehe ne hab ich auch nicht als solches empfunden Marrrk :)

Wenn ich hier nicht grad die besste Lösung präsentiert habe.. was mir von anfang an klar war :P dann ist es zumindest super das hier eben noch andere Wege und Möglichkeiten aufgezeigt werden... dafür ist das SnippetLabor ja auch da, nicht wahr :)

 

Allerdings funktioniert der link von dir leider nicht bei mir o.O

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 year later...
  • 1 month later...

Wie wäre es das Ganze "richtig" zu verschlüsseln? Zb so:

 

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Encryption
{
public class RFC2898Crypt
{
	public static string Encrypt(string clearText, string password)
	{
		//Convert text to bytes
		byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
		//We will derieve our Key and Vectore based on following
		//password and a random salt value, 13 bytes in size.
		var pdb = new Rfc2898DeriveBytes(password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
		byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));
		return Convert.ToBase64String(encryptedData);
	}
	public static byte[] Encrypt(byte[] clearData, byte[] key, byte[] iv)
	{
		byte[] encryptedData;
		//Create stream for encryption
		using (var ms = new MemoryStream())
		{
			//Create Rijndael object with key and vector
			using (TripleDES alg = TripleDES.Create())
			{
				alg.Key = key;
				alg.IV = iv;
				//Forming cryptostream to link with data stream.
				using (var cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write))
				{
					//Write all data to stream.
					cs.Write(clearData, 0, clearData.Length);
				}
				encryptedData = ms.ToArray();
			}
		}
		return encryptedData;
	}
	public static string Decrypt(string cipherText, string password)
	{
		//Convert base 64 text to bytes
		byte[] cipherBytes = Convert.FromBase64String(cipherText);
		//We will derieve our Key and Vectore based on following
		//password and a random salt value, 13 bytes in size.
		var pdb = new Rfc2898DeriveBytes(password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
		byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16));
		//Converting unicode string from decrypted data
		return Encoding.Unicode.GetString(decryptedData);
	}
	public static byte[] Decrypt(byte[] cipherData, byte[] key, byte[] iv)
	{
		byte[] decryptedData;
		//Create stream for decryption
		using (var ms = new MemoryStream())
		{
			//Create Rijndael object with key and vector
			using (var alg = TripleDES.Create())
			{
				alg.Key = key;
				alg.IV = iv;
				//Forming cryptostream to link with data stream.
				using (var cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write))
				{
					//Write all data to stream.
					cs.Write(cipherData, 0, cipherData.Length);
				}
				decryptedData = ms.ToArray();
			}
		}
		return decryptedData;
	}
}
}

 

 

oder mit BCrypt ...aber das ist "langsam" und auch eher für PW´s gedacht etc pp... allerdings sollte das Beispiel mit dem RFC2898Crypt für einfache Spielstände schon reichen.

 

Und das geht so:

private const string CryptoPassword = "¦ü/¼Ãh¦¨Üøâßçä°.@ÈÜÀmù]ÊÙó¸èàø>:fA_=ñJ×!©vÜïF'¦ï0}4ä98öpçÃlŧ#n";
// verschlüsseln
string  saveStuff = RFC2898Crypt.Encrypt(someString, CryptoPassword);
// und zurück
saveStuff  = RFC2898Crypt.Decrypt(fileContentAsString, CryptoPassword);

 

 

...und da sehe ich gerade, dass mark schon was zu AES gepostet hat... nun ja^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...