Segurança de objetos persistentes

O BlackBerry Device Software oferece duas maneiras principais de assegurar os objetos no armazenamento persistente:

Dependendo das necessidades de seu aplicativo, você pode usar ambas, uma ou nenhuma dessas abordagens.

Restrição do acesso a objetos persistentes

Os objetos armazenados que usam o armazenamento persistente são identificados por uma chave exclusiva, que tem um valor do tipo primitivo long. Para recuperar um objeto do armazenamento persistente, a chave associada ao objeto armazenado deve ser fornecida em chamadas de método. Por exemplo:

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

Confiar no valor chave desconhecido pode não fornecer a privacidade adequada para as informações armazenadas. Se desejar permitir que apenas aplicativos autorizados específicos acessem os dados do seu aplicativo, você deverá inserir o PersistentObject em uma classe net.rim.device.api.system.ControlledAccess junto com a geração de chave e um procedimento de assinatura da chave:

  • Criar uma chave de assinatura usando o BlackBerry Signing Authority Tool.
  • Associe um objeto ControlledAccess a uma chave de assinatura.
  • Insira o PersistentObject no objeto ControlledAccess.
  • Assine os aplicativos que exigem acesso aos dados protegidos usando a mesma chave de assinatura que protege os dados.

Aqui há um exemplo de como recuperar dados que estão protegidos com a classe 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 obter mais informações sobre como restringir o acesso a objetos persistentes, consulte Proteger objetos persistentes do acesso por aplicativos não autorizados.

Para obter mais informações sobre assinatura de código, consulte o Guia de desenvolvimento de segurança do BlackBerry Java SDK, disponível em www.blackberry.com/go/devguides.

Exemplo de código

O arquivo .cod do código a seguir deve ser assinado com a mesma chave do CodeSigningKey para proteger os dados.

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

O arquivo .cod do código a seguir deve ser assinado usando a mesma chave utilizada no código de exemplo acima.

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 acesso a dados de armazenamento persistentes usando chaves de assinatura de código

As chaves de assinatura de código podem ser usadas para controlar o acesso ao armazenamento persistente. Essa é uma maneira de restringir ou compartilhar o acesso com outros aplicativos em um aparelho BlackBerry.

  1. Importe as classes e interfaces necessárias.
    import java.util.Hashtable;
    import net.rim.device.api.system.PersistentObject;
  2. Crie uma ID de hash para o objeto que você deseja armazenar em um objeto persistente.
    long MY_DATA_ID = 0x33abf322367f9018L;
    Hashtable myHashtable = new Hashtable();
  3. Armazene o objeto no objeto persistente e proteja o objeto com o objeto CodeSigningKey. Por exemplo, depois que um aplicativo do aparelho BlackBerry executa a linha de código a seguir, somente os arquivos de código assinados com o arquivo RSAE.key poderão ler ou editar o objeto no objeto no objeto persistente.
    persistentObject.setContents( new ControlledAccess( myHashtable, key ) );
  4. Certifique-se de que o objeto esteja protegido e invoque getContents usando o objeto CodeSigningKey como parâmetro.
    Hashtable myHashtable = (Hashtable) persistentObject.getContents( key );

Estas informações foram úteis? Gostaríamos de receber seus comentários.