damuddamc Geschrieben 10. August 2012 Melden Share Geschrieben 10. August 2012 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; } } 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 10. August 2012 Melden Share Geschrieben 10. August 2012 Base64 ist keine Verschlüsselung mMn, man erkennt B64 sofort als B64 und decoder gibts wie Sand am Meer, also vorsichtig bei der Benutzung sein! B64 wird verwendet um Binärdaten als Strings zu halten, mehr eigentlich nicht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
damuddamc Geschrieben 10. August 2012 Autor Melden Share Geschrieben 10. August 2012 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.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 10. August 2012 Melden Share Geschrieben 10. August 2012 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. 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
nikk Geschrieben 18. September 2012 Melden Share Geschrieben 18. September 2012 Spricht was dagegen es tatsächlich zu verschlüsseln? Da hat Mono doch sicherlich irgendwelche Funktionen für. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 18. September 2012 Melden Share Geschrieben 18. September 2012 Wenn die Mono Version die mit Unity geliefert wird es hat dann würde das hier ausreichen: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged%28v=vs.90%29.aspx 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Lightstorm Geschrieben 18. September 2012 Melden Share Geschrieben 18. September 2012 Nette Idee jedenfalls Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
damuddamc Geschrieben 18. September 2012 Autor Melden Share Geschrieben 18. September 2012 @Marrrk das hatte ich auch schon drin, aufm pc im editor hats funktioniert allerdings nicht auf ios... daher ist die lösung für uns flach gefallen! ka ob ichs damals genau so gemacht hatte aber ich glaube schon, viel anders wirstes ja nicht machen können... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 19. September 2012 Melden Share Geschrieben 19. September 2012 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
damuddamc Geschrieben 19. September 2012 Autor Melden Share Geschrieben 19. September 2012 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 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 20. September 2012 Melden Share Geschrieben 20. September 2012 Seltsam, klicke ich drauf funktioniert es nach wie vor, du hast nicht etwa den reinen Text vom Link im Post kopiert und benutzt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
damuddamc Geschrieben 20. September 2012 Autor Melden Share Geschrieben 20. September 2012 Ne hatte ich nicht, hab direkt auf den link geklickt und bekam nen 404 Error... naja jetzt gehts! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tarantel Geschrieben 23. Juli 2014 Melden Share Geschrieben 23. Juli 2014 Moinsen kann es sein das diese Methode ab 4.3.4 nicht mehr funktioniert ^^ ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MaZy Geschrieben 26. Juli 2014 Melden Share Geschrieben 26. Juli 2014 Was genau funktioniert denn nicht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
AgentCodeMonk Geschrieben 17. September 2014 Melden Share Geschrieben 17. September 2014 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^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.