Daten sicher speichern

  • 5 Antworten
  • Letztes Antwortdatum
Q

qwert_zuiopue

Fortgeschrittenes Mitglied
6
Hallo,

wie kann ich ein Array aus Double-Werten so speichern, dass der Nutzer diese nicht verändern kann?
Mir fiele ein, dass ich die Werte ganz normal in ein Textdokument schreibe und dann in den Shared-Preferences einen Hash-Wert. Stimmen die Werte nicht überein, verweigert die App den Start. Das ist zwar noch nicht 100% sicher, aber schonmal eine Herausforderung für den Hobby-Informatiker :).
Geht das einfacher?

Danke für eine kurze Auskunft :).

EDIT: Mir ist noch was eingefallen: Es geht darum, dass der Nutzer Zugriff auf eine Datenbank hat, aber nur auf Einträge mit einer bestimmten ID. Daher könnte ich auch eine eindeutige Nummer des Handys verwenden und diese zusätzlich in der Datenbank abspeichern. Sodann gilt die ID zusammen mit der Handy-ID als Schlüssel für die Tabelle. Trotzdem die Frage, ob es vllt. doch einfacher geht, ohne zusätzliche Daten in die DB eintragen zu müssen.
 
Zuletzt bearbeitet:
A

Anzeige

  • Gerade eben
  • Neu
Also das ist glaube ich kein Problem ich glaube Java verfügt über eine hash Methode.

Du kannst die Datei auch verschlüsseln dann kann der Nutzer sie nicht gezielt verändern

Gesendet von meinem LG-P880 mit der Android-Hilfe.de App
 
Verschlüsselung ist wohl das Mittel der Wahl, wenn du ganz sicher gehen willst.

Denn, wenn ich an die Daten ran kommen will, dann müsste man mit root-Rechten nur deine Datenbank mit einem x-beliebigen Programm öffnen und sieht auch alle Daten. Nur so als Gedanke ;)
 
Hoffentlich hilf es dir weiter:
Sind zwei methoden zum verschlüsseln und entschlüsseln von String Dateien, ansonsten könntest du dir auch mal https://github.com/sveinungkb/encrypted-userprefs anschauen. Viel erfolg!!
Code:
public String encode(Context context, String password, String text) throws NoPassGivenException, NoTextGivenException {
		if (password.length() == 0 || password == null) {
			throw new NoPassGivenException("Please supply Password");
		}
		
		if(text.length() == 0 || text == null){
			throw new NoTextGivenException("Please supply text");
		}
		
		try {
			DESKeySpec keySpec = new DESKeySpec(password.getBytes("UTF8"));
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey key = keyFactory.generateSecret(keySpec);

			byte[] clearText = text.getBytes("UTF8");
			// Cipher is not thread safe
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, key);

			String encrypedValue = Base64.encodeToString(
					cipher.doFinal(clearText), Base64.DEFAULT);
			Log.d(TAG, "Encrypted: " + text + " -> " + encrypedValue);
			return encrypedValue;

		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		}
//TODO NOT GOOD
		return "";
	}

	public String decode(Context context, String password, String text) throws NoPassGivenException, NoTextGivenException {
		
		if (password.length() == 0 || password == null) {
			throw new NoPassGivenException("Please supply Password");
		}
		
		if(text.length() == 0 || text == null){
			throw new NoTextGivenException("Please supply text");
		}
		
		try {
			DESKeySpec keySpec = new DESKeySpec(password.getBytes("UTF8"));
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey key = keyFactory.generateSecret(keySpec);

			byte[] encrypedPwdBytes = Base64.decode(text, Base64.DEFAULT);
			// cipher is not thread safe
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.DECRYPT_MODE, key);
			byte[] decrypedValueBytes = (cipher.doFinal(encrypedPwdBytes));

			String decrypedValue = new String(decrypedValueBytes);
			Log.d(TAG, "Decrypted: " + text + " -> " + decrypedValue);
			return decrypedValue;

		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		}
//TODO NOT GOOD
		return "";
	}

	public class NoTextGivenException extends Exception {
		public NoTextGivenException() {
			super();
		}

		public NoTextGivenException(String message) {
			super(message);
		}

		public NoTextGivenException(String message, Throwable cause) {
			super(message, cause);
		}

		public NoTextGivenException(Throwable cause) {
			super(cause);
		}
	}
	
	public class NoPassGivenException extends Exception {
		public NoPassGivenException() {
			super();
		}

		public NoPassGivenException(String message) {
			super(message);
		}

		public NoPassGivenException(String message, Throwable cause) {
			super(message, cause);
		}

		public NoPassGivenException(Throwable cause) {
			super(cause);
		}
	}
 
Zuletzt bearbeitet:
OT: "overgive" gibt es im Englischen nicht, das heisst "pass/enter/supply a password". (SCNR :D)
 
  • Danke
Reaktionen: soma-web
Vielen Dank für deine Mühe, ich schaus mir an :).
 
Zurück
Oben Unten