Sicherheit von permanenten Objekten

BlackBerry Device Software bietet zwei Hauptmöglichkeiten zum Sichern von Objekten im permanenten Speicher:

Je nach den Anforderungen Ihrer Anwendung könnten Sie beide, einen oder gar keinen dieser Ansätze verwenden.

Einschränken des Zugriffs auf permanente Objekte

Für Objekte, die mithilfe des permanenten Speichers gespeichert werden, wird zu deren Identifizierung ein einmaliger Schlüssel verwendet, der einen Wert des primitiven Typs long aufweist. Um ein Objekt aus dem permanenten Speicher abzurufen, muss der Schlüssel, der dem Objekt bei der Speicherung zugewiesen wurde, in Methodenaufrufen bereitgestellt werden. Beispiel:

long key = 0x52834c0559055c3L;
PersistentObject rec = PersistentStore.getPersistentObject(key);
String stored_value = (String) rec.getContents();

Das Vertrauen darauf, dass der Schlüsselwert unbekannt ist, gewährleistet möglicherweise keinen angemessenen Datenschutz für die gespeicherten Informationen. Wenn Sie nur bestimmten, autorisierten Anwendungen Zugriff auf Ihre Anwendungsdaten gewähren möchten, binden Sie PersistentObject in eine net.rim.device.api.system.ControlledAccess-Klasse in Verbindung mit der Schlüsselerstellung und einem Verfahren für das Signieren von Schlüsseln ein:

  • Erstellen eines Signaturschlüssels mit dem BlackBerry Signing Authority Tool Authority Tool
  • Weisen Sie dem Signaturschlüssel ein ControlledAccess-Objekt zu.
  • Binden Sie PersistentObject in das ControlledAccess-Objekt ein.
  • Signieren Sie Anwendungen, die Zugriff auf die geschützten Daten mithilfe desselben Signaturschlüssels erfordern, der die Daten schützt.

Im folgenden Beispiel wird dargestellt, wie man Daten abruft, die mit der ControlledAccess-Klasse geschützt sind:

long key = 0x52834c0559055c3L;
try {
    PersistentObject rec = PersistentStore.getPersistentObject(key);
    int moduleHandle = ApplicationDescriptor.currentApplicationDescriptor​().getModuleHandle();
    CodeSigningKey codeSigningKey = CodeSigningKey.get( moduleHandle, "MDW" );
    String b = (String) rec.getContents( codeSigningKey );
    Dialog.inform("Read PersistentObject. Value="+b);
}   catch (ControlledAccessException e) {
    Dialog.alert("ControlledAccessException - not authorised to read this data");
}

Weitere Informationen zum Beschränken des Zugriffs auf permanente Objekte finden Sie unter Schützen von permanenten Objekten vor dem Zugriff durch nicht autorisierte Anwendungen.

Weitere Informationen zur Codesignatur finden Sie im BlackBerry Java SDK Security Development Guide (Sicherheits-Entwicklungshandbuch für BlackBerry Java SDK)unter www.blackberry.com/go/devguides.

Codebeispiel

Die COD-Datei für den folgenden Code muss mithilfe des Schlüssels, der für den Datenschutz als CodeSigningKey verwendet wird, signiert werden.

import net.rim.device.api.system.ApplicationDescriptor;
import net.rim.device.api.system.CodeSigningKey;
import net.rim.device.api.system.ControlledAccess;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.ui.*;
public class ControlledAccessCreator extends UiApplication {
  public static void main(String[] args) {
    ControlledAccessCreator cac = new ControlledAccessCreator();
    cac.enterEventDispatcher();
  }
  private ControlledAccessCreator() {
    ControlledAccessCreatorScreen screen = new ControlledAccessCreatorScreen();
    pushScreen(screen);
  }
}
class ControlledAccessCreatorScreen extends MainScreen {	
  private MenuItem _initialiseMenuItem = new MenuItem("Initialise", 100, 10) {
    public void run() {
      String a = "Hello";
      long key = 0x52834c0559055c3L;
      PersistentObject rec = PersistentStore.getPersistentObject(key);
      int moduleHandle = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle();
      CodeSigningKey codeSigningKey = CodeSigningKey.get( moduleHandle, "MDW" );
      rec.setContents(new ControlledAccess(a,codeSigningKey));
      rec.commit();
      String b = (String) rec.getContents( codeSigningKey );
      Dialog.inform("Initialised... now try to acccess the data from another app");
      invalidate();
    }
  };
  ControlledAccessCreatorScreen() {
    setTitle(new LabelField("ControlledAccess Demo",
	   LabelField.USE_ALL_WIDTH));
    addMenuItem(_initialiseMenuItem);
  }
  public boolean onSavePrompt() {
    return true;
  }
  public void close() {
    super.close();
  }
}

Die COD-Datei für den folgenden Code muss mithilfe des Schlüssels, der für den obigen Beispiel-Code verwendet wurde, signiert werden.

import net.rim.device.api.system.ApplicationDescriptor;
import net.rim.device.api.system.CodeSigningKey;
import net.rim.device.api.system.ControlledAccess;
import net.rim.device.api.system.ControlledAccessException;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.ui.*;
public class ControlledAccessAuthorisedUser extends UiApplication {
  public static void main(String[] args) {
    ControlledAccessAuthorisedUser caau = new ControlledAccessAuthorisedUser();
    caau.enterEventDispatcher();
  }
  private ControlledAccessAuthorisedUser() {
    ControlledAccessAuthorisedUserScreen screen = new ControlledAccessAuthorisedUserScreen();
    pushScreen(screen);
  }
}
class ControlledAccessAuthorisedUserScreen extends MainScreen {	
  private MenuItem _readMenuItem = new MenuItem("Read protected data", 100, 10) {
      public void run() {
        long key = 0x52834c0559055c3L;
        try {
	 PersistentObject rec = PersistentStore.getPersistentObject(key);
	 int moduleHandle = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle();
    CodeSigningKey codeSigningKey = CodeSigningKey.get( moduleHandle, "MDW" );
	  String b = (String) rec.getContents( codeSigningKey );
	  Dialog.inform("Read PersistentObject. Value="+b);
        } catch (ControlledAccessException e) {
	  Dialog.alert("ControlledAccessException - not authorised to read this data");
        }
    }
  };
  ControlledAccessAuthorisedUserScreen() {
    setTitle(new LabelField("ControlledAccess Demo",
	      LabelField.USE_ALL_WIDTH));
    addMenuItem(_readMenuItem);
  }
  public boolean onSavePrompt() {
    return true;
  }
  public void close() {
    super.close();
  }
}

Einschränken des Zugriffs auf permanente Speicherdaten mithilfe von Codesignaturschlüsseln

Codesignaturschlüssel können verwendet werden, um den Zugriff auf den permanenten Speicher zu steuern. Auf diese Weise können Sie den Zugriff anderer Anwendungen auf einem BlackBerry-Gerät einschränken oder freigeben.

  1. Importieren Sie die erforderlichen Klassen und Schnittstellen.
    import java.util.Hashtable;
    import net.rim.device.api.system.PersistentObject;
  2. Erstellen Sie eine Hash-ID für das Objekt, das Sie in einem dauerhaften Objekt speichern möchten.
    long MY_DATA_ID = 0x33abf322367f9018L;
    Hashtable myHashtable = new Hashtable();
  3. Speichern Sie das Objekt im dauerhaften Objekt und schützen Sie das Objekt mit dem CodeSigningKey-Objekt. Wenn z. B. eine BlackBerry-Geräteanwendung den folgenden Code ausführt, können nur Code-Dateien, die mit der RSAE-Schlüsseldatei signiert sind, das Objekt im dauerhaftem Objekt lesen oder überschreiben.
    persistentObject.setContents( new ControlledAccess( myHashtable, key ) );
  4. Stellen Sie sicher, dass das Objekt geschützt ist und rufen Sie getContents mithilfe des CodeSigningKey-Objekts als Parameter auf.
    Hashtable myHashtable = (Hashtable) persistentObject.getContents( key );

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.