Sicherheit von permanenten Objekten
BlackBerry Device Software bietet zwei Hauptmöglichkeiten zum Sichern von Objekten im permanenten Speicher:
- Einschränken des Zugriffs auf die Objekte mit der net.rim.device.api.system.ControlledAccess-Klasse und Codesignaturschlüsseln
- Verschlüsseln und Entschlüsseln von Objekten mit der net.rim.device.api.system.PersistentContent-Klasse
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
Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.