Seguridad de objetos constantes

BlackBerry Device Software cuenta con dos métodos fundamentales para proteger los objetos en el almacén constante:

Dependiendo de las necesidades de su aplicación, podría utilizar ambos, uno o ninguno de estos dos enfoques.

Restringir el acceso a objetos constantes

Los objetos almacenados mediante el almacén constante se identifican con una clave única, que tiene un valor del tipo primitivo long. Para recuperar un objeto del almacén constante, la clave que se asoció al objeto cuando fue almacenado debe suministrarse en llamadas a métodos. Por ejemplo:

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

Depender de que el valor de la clave sea desconocido no puede ofrecer la privacidad adecuada para la información almacenada. Si desea permitir que únicamente aplicaciones específicas y autorizadas obtengan acceso a los datos de la aplicación, debe ajustar PersistentObject en una clase net.rim.device.api.system.ControlledAccess junto con un proceso de generación de claves y de claves de firma:

  • Crear una clave de firma mediante BlackBerry Signing Authority Tool.
  • Asocie un objeto ControlledAccess con la clave de firma.
  • Ajuste PersistentObject en el objeto ControlledAccess.
  • Firme las aplicaciones que requieran el acceso a los datos protegidos mediante la misma clave de firma que protege los datos.

Aquí tiene un ejemplo de cómo recuperar los datos protegidos con la clase ControlledAccess:

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");
}

Para obtener más información acerca de cómo restringir el acceso a objetos constantes, consulte Proteger los objetos constantes del acceso por parte de aplicaciones no autorizadas.

Para obtener más información acerca dela firma de código, consulte la Guía de desarrollo de seguridad de BlackBerry Java SDK, disponible en www.blackberry.com/go/devguides.

Ejemplo de código

El archivo .cod para el código siguiente debe firmarse mediante la clave que se utiliza como CodeSigningKey para proteger los datos.

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();
  }
}

El archivo de .cod para el código siguiente debe firmarse mediante la clave que se utilizó para el código de ejemplo antes mencionado.

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();
  }
}

Restringir el acceso a datos del almacén constante mediante claves de firma de código

Las claves de firma de código pueden utilizarse para controlar el acceso al almacén constante. De esta forma, se puede restringir o compartir el acceso con otras aplicaciones del dispositivo BlackBerry.

  1. Importe las clases y las interfaces necesarias.
    import java.util.Hashtable;
    import net.rim.device.api.system.PersistentObject;
  2. Cree un ID de hash para el objeto que desea almacenar en un objeto constante.
    long MY_DATA_ID = 0x33abf322367f9018L;
    Hashtable myHashtable = new Hashtable();
  3. Almacene el objeto en el objeto constante y protéjalo con el objeto CodeSigningKey. Por ejemplo, una vez que una aplicación del dispositivo BlackBerry haya ejecutado la siguiente línea de código, sólo los archivos .cod firmados con el archivo RSAE.key pueden leer o sobrescribir el objeto en el objeto constante.
    persistentObject.setContents( new ControlledAccess( myHashtable, key ) );
  4. Asegúrese de que el objeto está protegido e invoque getContents utilizando el objeto CodeSigningKey como parámetro.
    Hashtable myHashtable = (Hashtable) persistentObject.getContents( key );

¿Le ha resultado útil esta información? Envíenos sus comentarios.