gotowe do prezentacji
This commit is contained in:
parent
2736b3df36
commit
91f6890acd
@ -9,26 +9,15 @@ import androidx.core.content.ContextCompat;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.security.keystore.KeyGenParameterSpec;
|
||||
import android.security.keystore.KeyProperties;
|
||||
import android.util.Log;
|
||||
import android.widget.Button;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.KeyStore;
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.KeyGenerator;
|
||||
import javax.crypto.SecretKey;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
|
||||
private static final String KEY_NAME = "nazwaKlucza";
|
||||
Button btnLogIn;
|
||||
|
||||
@Override
|
||||
@ -86,16 +75,13 @@ public class MainActivity extends AppCompatActivity {
|
||||
});
|
||||
|
||||
promptInfo = new BiometricPrompt.PromptInfo.Builder()
|
||||
.setTitle("Biometric login for my app")
|
||||
.setTitle("Biometric login for your notes")
|
||||
.setSubtitle("Log in using biometric credential")
|
||||
.setNegativeButtonText("xd")
|
||||
.setNegativeButtonText(" ")
|
||||
.setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_STRONG)
|
||||
.build();
|
||||
|
||||
btnLogIn.setOnClickListener(view -> {
|
||||
biometricPrompt.authenticate(promptInfo);
|
||||
|
||||
});
|
||||
btnLogIn.setOnClickListener(view -> biometricPrompt.authenticate(promptInfo));
|
||||
|
||||
}
|
||||
|
||||
|
@ -2,15 +2,11 @@ package com.example.bsm_fingerptint_tutorial;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.biometric.BiometricPrompt;
|
||||
import androidx.lifecycle.LifecycleCoroutineScope;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.security.keystore.KeyGenParameterSpec;
|
||||
import android.security.keystore.KeyProperties;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
@ -21,17 +17,11 @@ import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.KeyStore;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.KeyGenerator;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
|
||||
@ -39,13 +29,11 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
|
||||
private List<Note> noteList;
|
||||
private LinearLayout notesContainer;
|
||||
private static final String SHARED_NAME_NOTES = "Notatki";
|
||||
|
||||
private static final String KEY_NAME = "nazwaKluczaa";
|
||||
|
||||
|
||||
|
||||
private static final String SHARED_NAME_NOTES = "Notes";
|
||||
private static final String KEY_NAME = "MyKey1";
|
||||
Button buttonLogout, buttonAddNote;
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
@ -57,7 +45,7 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
try {
|
||||
loadNotesFromPreferencesToList();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
Log.e("Error from NotepadActivity", "Caused by loadNotesFromPreferencesToList() invoked from onCreate()" + e.getMessage(), e);
|
||||
}
|
||||
displayNotes();
|
||||
|
||||
@ -99,10 +87,8 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
|
||||
try {
|
||||
saveNotesToPreferences("add");
|
||||
} catch (GeneralSecurityException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (GeneralSecurityException | IOException e) {
|
||||
Log.e("Error from NotepadActivity", "Caused by saveNotesToPreferences() invoked from showAddNoteDialog()" + e.getMessage(), e);
|
||||
}
|
||||
|
||||
createNoteView(note);
|
||||
@ -146,10 +132,8 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
|
||||
try {
|
||||
saveNotesToPreferences("add");
|
||||
} catch (GeneralSecurityException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (GeneralSecurityException | IOException e) {
|
||||
Log.e("Error from NotepadActivity", "Caused by saveNotesToPreferences() invoked from showEditNoteDialog()" + e.getMessage(), e);
|
||||
}
|
||||
|
||||
}else {
|
||||
@ -164,38 +148,37 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
alertDialog.show();
|
||||
}
|
||||
|
||||
|
||||
private void saveNotesToPreferences(String mode) throws GeneralSecurityException, IOException {
|
||||
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_NAME_NOTES, MODE_PRIVATE);
|
||||
SharedPreferences.Editor editor = sharedPreferences.edit();
|
||||
|
||||
|
||||
if (mode.equals("del")){
|
||||
int noteCount = sharedPreferences.getInt("_notecount_", 0);
|
||||
for(int i=0; i<noteCount; i++){
|
||||
editor.remove(i + "_title_");
|
||||
editor.remove(i + "_content_");
|
||||
}
|
||||
if (mode.equals("del")){
|
||||
int noteCount = sharedPreferences.getInt("_notecount_", 0);
|
||||
for(int i=0; i<noteCount; i++){
|
||||
editor.remove(i + "_title_");
|
||||
editor.remove(i + "_content_");
|
||||
}
|
||||
}
|
||||
|
||||
IvParameterSpec iv = UtilsCipher.generateIv();
|
||||
String ivString = ivToString(iv);
|
||||
saveIvStringToShared(ivString);
|
||||
IvParameterSpec iv = UtilsCipher.generateIv();
|
||||
String ivString = ivToString(iv);
|
||||
saveIvStringToShared(ivString);
|
||||
|
||||
SecretKey secretKey = UtilsCipher.generateRandomKey(KEY_NAME);
|
||||
SecretKey secretKey = UtilsCipher.generateRandomKey(KEY_NAME);
|
||||
|
||||
editor.putInt("_notecount_", noteList.size());
|
||||
for(int i=0; i<noteList.size(); i++){
|
||||
Note note = noteList.get(i);
|
||||
|
||||
editor.putInt("_notecount_", noteList.size());
|
||||
for(int i=0; i<noteList.size(); i++){
|
||||
Note note = noteList.get(i);
|
||||
String encryptedTitle = UtilsCipher.encrypt("AES/CBC/PKCS7Padding", note.getTitle(), secretKey, iv);
|
||||
String encryptedContent = UtilsCipher.encrypt("AES/CBC/PKCS7Padding", note.getContent(), secretKey, iv);
|
||||
|
||||
String encryptedTitle = UtilsCipher.encrypt("AES/CBC/PKCS7Padding", note.getTitle(), secretKey, iv);
|
||||
String encryptedContent = UtilsCipher.encrypt("AES/CBC/PKCS7Padding", note.getContent(), secretKey, iv);
|
||||
editor.putString(i + "_title_", encryptedTitle);
|
||||
editor.putString(i + "_content_", encryptedContent);
|
||||
}
|
||||
|
||||
editor.putString(i + "_title_", encryptedTitle);
|
||||
editor.putString(i + "_content_", encryptedContent);
|
||||
}
|
||||
|
||||
editor.apply();
|
||||
editor.apply();
|
||||
|
||||
|
||||
}
|
||||
@ -204,24 +187,25 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_NAME_NOTES, MODE_PRIVATE);
|
||||
int noteCount = sharedPreferences.getInt("_notecount_", 0);
|
||||
|
||||
String ivString = getIVStringFromShared();
|
||||
IvParameterSpec iv = stringToIv(ivString);
|
||||
if (noteCount!=0){
|
||||
String ivString = getIVStringFromShared();
|
||||
IvParameterSpec iv = stringToIv(ivString);
|
||||
|
||||
SecretKey secretKey = UtilsCipher.retrieveKey(KEY_NAME);
|
||||
SecretKey secretKey = UtilsCipher.retrieveKey(KEY_NAME);
|
||||
|
||||
for(int i=0; i<noteCount; i++){
|
||||
String title = sharedPreferences.getString(i + "_title_", "");
|
||||
String content = sharedPreferences.getString(i + "_content_", "");
|
||||
|
||||
for(int i=0; i<noteCount; i++){
|
||||
String title = sharedPreferences.getString(i + "_title_", "");
|
||||
String content = sharedPreferences.getString(i + "_content_", "");
|
||||
String decryptedTitle = UtilsCipher.decrypt("AES/CBC/PKCS7Padding", title, secretKey, iv);
|
||||
String decryptedContent = UtilsCipher.decrypt("AES/CBC/PKCS7Padding", content, secretKey, iv);
|
||||
|
||||
String decryptedTitle = UtilsCipher.decrypt("AES/CBC/PKCS7Padding", title, secretKey, iv);
|
||||
String decryptedContent = UtilsCipher.decrypt("AES/CBC/PKCS7Padding", content, secretKey, iv);
|
||||
Note note = new Note();
|
||||
note.setTitle(decryptedTitle);
|
||||
note.setContent(decryptedContent);
|
||||
|
||||
Note note = new Note();
|
||||
note.setTitle(decryptedTitle);
|
||||
note.setContent(decryptedContent);
|
||||
|
||||
noteList.add(note);
|
||||
noteList.add(note);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -249,7 +233,6 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void createNoteView(final Note note){
|
||||
@SuppressLint("InflateParams") View noteView = getLayoutInflater().inflate(R.layout.note_item, null);
|
||||
TextView noteTitleTextView = noteView.findViewById(R.id.note_title_text_view);
|
||||
@ -284,10 +267,9 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
noteList.remove(note);
|
||||
try {
|
||||
saveNotesToPreferences("del");
|
||||
} catch (GeneralSecurityException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (GeneralSecurityException | IOException e) {
|
||||
Log.e("Error from NotepadActivity", "Caused by saveNotesToPreferences() invoked from deleteNoteAndRefresh()" + e.getMessage(), e);
|
||||
|
||||
}
|
||||
refreshNotesView();
|
||||
}
|
||||
@ -296,23 +278,8 @@ public class NotepadActivity extends AppCompatActivity {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle("Delete this note");
|
||||
builder.setMessage("Are you sure you want to delete it?");
|
||||
builder.setPositiveButton("Delete", (dialogInterface, i) -> {
|
||||
deleteNoteAndRefresh(note);
|
||||
});
|
||||
builder.setPositiveButton("Delete", (dialogInterface, i) -> deleteNoteAndRefresh(note));
|
||||
builder.setNegativeButton("Cancel", null);
|
||||
builder.show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -2,17 +2,12 @@ package com.example.bsm_fingerptint_tutorial;
|
||||
|
||||
import android.security.keystore.KeyGenParameterSpec;
|
||||
import android.security.keystore.KeyProperties;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.Key;
|
||||
import java.security.KeyStore;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Base64;
|
||||
|
||||
@ -23,14 +18,11 @@ import javax.crypto.KeyGenerator;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
public class UtilsCipher {
|
||||
|
||||
public static SecretKey generateRandomKey(String keyAlias) throws NoSuchProviderException,
|
||||
NoSuchAlgorithmException {
|
||||
|
||||
try {
|
||||
// generates random key and saves it to keystore under keyAlias alias
|
||||
public static SecretKey generateRandomKey(String keyAlias) throws GeneralSecurityException {
|
||||
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
|
||||
KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(
|
||||
keyAlias,
|
||||
@ -41,16 +33,11 @@ public class UtilsCipher {
|
||||
.build();
|
||||
|
||||
keyGenerator.init(keyGenParameterSpec);
|
||||
Log.i("KEY_GENERATEOT", keyGenerator.generateKey().toString());
|
||||
return keyGenerator.generateKey();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// returns key from keystore saved under keyAlias alias
|
||||
public static SecretKey retrieveKey(String keyAlias) throws Exception {
|
||||
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
|
||||
keyStore.load(null);
|
||||
@ -85,7 +72,4 @@ public class UtilsCipher {
|
||||
return new IvParameterSpec(iv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user