2017-04-26 8 views
1

私はノートを保存、編集、削除できるアプリケーションを作成しており、アプリケーションのプライベートストレージエリアに保存されます。保存されているデータは暗号化する必要がありますが、プログラミングには慣れていないので、どのようにすればよいのか分かりません。私はノートを保存するために使用されるメソッドのために以下のコードを入れますが、セキュリティ上の理由から、暗号化が必要です。初心者にとっては最も簡単な方法は何でしょうか? アプリケーションのプライベートストレージに保存されているデータを暗号化する方法

public class Utilities { 

    public static final String FILE_EXTENSION = ".bin"; 

    public static boolean saveNote(Context context, Notes notes){ 
     String fileName = String.valueOf(notes.getDateTime()) + FILE_EXTENSION; 

     FileOutputStream fos; 
     ObjectOutputStream oos; 

     try { 
      fos = context.openFileOutput(fileName, context.MODE_PRIVATE); 
      oos = new ObjectOutputStream(fos); 
      oos.writeObject(notes); 
      oos.close(); 
      fos.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; //tell the user something went wrong 
     } 
     return true; 
    } 

    public static ArrayList<Notes> getSavedNotes(Context context) { 
     ArrayList<Notes> notes = new ArrayList<>(); 

     File filesDir = context.getFilesDir(); 
     filesDir.getAbsolutePath(); 
     ArrayList<String> noteFiles = new ArrayList<>(); 

     for(String file : filesDir.list()) { 
      if(file.endsWith(FILE_EXTENSION)) { 
       noteFiles.add(file); 
      } 
     } 

     FileInputStream fis; 
     ObjectInputStream ois; 

     for(int i = 0; i < noteFiles.size(); i++) { 
      try{ 
       fis = context.openFileInput(noteFiles.get(i)); 
       ois = new ObjectInputStream(fis); 

       notes.add((Notes)ois.readObject()); 

       fis.close(); 
       ois.close(); 



      } catch (IOException | ClassNotFoundException e) { 
       e.printStackTrace(); 
       return null; 

      } 
     } 

     return notes; 

    } 

    public static Notes getNoteByName(Context context, String fileName) { 
     File file = new File(context.getFilesDir(), fileName); 
     Notes notes; 

     if(file.exists()) { 
      FileInputStream fis; 
      ObjectInputStream ois; 

      try { 
       fis = context.openFileInput(fileName); 
       ois = new ObjectInputStream(fis); 

       notes = (Notes) ois.readObject(); 

       fis.close(); 
       ois.close(); 

      } catch(IOException | ClassNotFoundException e){ 
       e.printStackTrace(); 
       return null; 
      } 

      return notes; 
     } 

     return null; 
    } 

    public static void deleteNote(Context context, String fileName) { 
     File Dir = context.getFilesDir(); 
     File file = new File(Dir, fileName); 

     if (file.exists()) file.delete(); 
    } 

    public static void main(String[] args) { 
     try { 
      String key = "squirrel123"; // needs to be at least 8 characters for DES 

      FileInputStream fis = new FileInputStream("original.txt"); 
      FileOutputStream fos = new FileOutputStream("encrypted.txt"); 
      encrypt(key, fis, fos); 

      FileInputStream fis2 = new FileInputStream("encrypted.txt"); 
      FileOutputStream fos2 = new FileOutputStream("decrypted.txt"); 
      decrypt(key, fis2, fos2); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void encrypt(String key, InputStream is, OutputStream os) throws Throwable { 
     encryptOrDecrypt(key, Cipher.ENCRYPT_MODE, is, os); 
    } 

    public static void decrypt(String key, InputStream is, OutputStream os) throws Throwable { 
     encryptOrDecrypt(key, Cipher.DECRYPT_MODE, is, os); 
    } 

    public static void encryptOrDecrypt(String key, int mode, InputStream is, OutputStream os) throws Throwable { 
     DESKeySpec dks = new DESKeySpec(key.getBytes()); 
     SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); 
     SecretKey desKey = skf.generateSecret(dks); 
     Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE 

     if (mode == Cipher.ENCRYPT_MODE) { 
      cipher.init(Cipher.ENCRYPT_MODE, desKey); 
      CipherInputStream cis = new CipherInputStream(is, cipher); 
      doCopy(cis, os); 
     } else if (mode == Cipher.DECRYPT_MODE) { 
      cipher.init(Cipher.DECRYPT_MODE, desKey); 
      CipherOutputStream cos = new CipherOutputStream(os, cipher); 
      doCopy(is, cos); 
     } 
    } 

    public static void doCopy(InputStream is, OutputStream os) throws IOException { 
     byte[] bytes = new byte[64]; 
     int numBytes; 
     while ((numBytes = is.read(bytes)) != -1) { 
      os.write(bytes, 0, numBytes); 
     } 
     os.flush(); 
     os.close(); 
     is.close(); 

    } 

} 

編集

: は、私は今どのように私は、実際にデータが暗号化されている知っているだろうにも、それは次のようになり、既存のコードの下DES暗号化の例を追加していますか?

public class Utilities { 

    public static final String FILE_EXTENSION = ".bin"; 

    public static boolean saveNote(Context context, Notes notes){ 
     String fileName = String.valueOf(notes.getDateTime()) + FILE_EXTENSION; 

     FileOutputStream fos; 
     ObjectOutputStream oos; 

     try { 
      fos = context.openFileOutput(fileName, context.MODE_PRIVATE); 
      oos = new ObjectOutputStream(fos); 
      oos.writeObject(notes); 
      oos.close(); 
      fos.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; //tell the user something went wrong 
     } 
     return true; 
    } 

    public static ArrayList<Notes> getSavedNotes(Context context) { 
     ArrayList<Notes> notes = new ArrayList<>(); 

     File filesDir = context.getFilesDir(); 
     filesDir.getAbsolutePath(); 
     ArrayList<String> noteFiles = new ArrayList<>(); 

     for(String file : filesDir.list()) { 
      if(file.endsWith(FILE_EXTENSION)) { 
       noteFiles.add(file); 
      } 
     } 

     FileInputStream fis; 
     ObjectInputStream ois; 

     for(int i = 0; i < noteFiles.size(); i++) { 
      try{ 
       fis = context.openFileInput(noteFiles.get(i)); 
       ois = new ObjectInputStream(fis); 

       notes.add((Notes)ois.readObject()); 

       fis.close(); 
       ois.close(); 
      } catch (IOException | ClassNotFoundException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     return notes; 
    } 

    public static Notes getNoteByName(Context context, String fileName) { 
     File file = new File(context.getFilesDir(), fileName); 
     Notes notes; 

     if(file.exists()) { 
      FileInputStream fis; 
      ObjectInputStream ois; 

      try { 
       fis = context.openFileInput(fileName); 
       ois = new ObjectInputStream(fis); 

       notes = (Notes) ois.readObject(); 

       fis.close(); 
       ois.close(); 
      } catch(IOException | ClassNotFoundException e){ 
       e.printStackTrace(); 
       return null; 
      } 

      return notes; 
     } 

     return null; 
    } 

    public static void deleteNote(Context context, String fileName) { 
     File Dir = context.getFilesDir(); 
     File file = new File(Dir, fileName); 

     if(file.exists()) { 
      file.delete(); 
     } 
    } 
} 

答えて

0

DES(データ暗号化標準)は、あなたのような単純なタスクではかなり一般的です。それを使用する方法のチュートリアルがオンラインでたくさんあります。私が使用した例は次のとおりです。http://www.avajava.com/tutorials/lessons/how-do-i-encrypt-and-decrypt-files-using-des.html

ユーザーがパスワードベースのキー導出機能をさらに使いこなした別のスレッドがありました。これも試用する価値があります。 How to encrypt and salt the password using BouncyCastle API in Java?

+0

もし私がDESのリンクからサンプルコードを使用していたら、新しいJavaクラスファイルを作成して追加するか、この質問に入れた現在のものを置き換えますか? – Jay1

+0

@ Jay1あなたの現在のクラスに追加します。クラスに新しいメソッド(暗号化、復号化など)を追加するだけです。それらを正確にコピーできるはずです。プロジェクトの実装をカスタマイズする必要があります。この例のMainメソッドはあなたを正しい軌道に乗せるはずです! – coinbird

+0

大丈夫、私は現在のソースコードの下にある既存のクラスにサンプルコードを追加しました。私は何をしたのかを表示するために投稿を編集しますが、データは実際に暗号化/ – Jay1

関連する問題