From f1dfa6c473634d0b74fae483b626dd6d2191b497 Mon Sep 17 00:00:00 2001 From: "mikgaw@st.amu.edu.pl" Date: Sun, 18 Feb 2024 16:38:12 +0100 Subject: [PATCH] modified README --- README.md | 28 +++++++++++++++++- .../example/bsm_notatnik/MainActivity.java | 12 +------- .../com/example/bsm_notatnik/Register.java | 17 +++++------ .../com/example/bsm_notatnik/Utility.java | 6 ++++ .../com/example/bsm_notatnik/UtilityAES.java | 3 +- app/src/main/res/layout/activity_main.xml | 8 ++--- .../main/res/layout/create_note_dialog.xml | 4 +-- app/src/main/res/layout/note_item.xml | 4 +-- .../res/layout/password_change_dialog.xml | 6 ++-- app/src/main/res/values-night/themes.xml | 4 +-- app/src/main/res/values/strings.xml | 9 ++++++ app/src/main/res/values/themes.xml | 1 - screenshots/change_password.png | Bin 0 -> 103032 bytes screenshots/create_note.png | Bin 0 -> 74324 bytes screenshots/delete_note.png | Bin 0 -> 99019 bytes screenshots/main_screen.png | Bin 0 -> 102127 bytes screenshots/register.png | Bin 0 -> 47201 bytes 17 files changed, 63 insertions(+), 39 deletions(-) create mode 100644 screenshots/change_password.png create mode 100644 screenshots/create_note.png create mode 100644 screenshots/delete_note.png create mode 100644 screenshots/main_screen.png create mode 100644 screenshots/register.png diff --git a/README.md b/README.md index efbdcd0..332d527 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,29 @@ # AES-secured-notepad -To bezpieczny notatnik szyfrujący dane algorytmem AES-256. \ No newline at end of file +Głównym celem projektu jest zastosowanie jak najlepszych mechanizmów szyfrujących do bezpiecznego przechowywania notatek. Dostęp do notatek wymaga każdorazowo zalogowania z użyciem hasła. Aplikacja jest przysotosowana do obsługi wielu użytkowników. + +### Wykorzystane mechanizmy bezpieczeństwa + +1. Maksymalnie 5 prób logowania na 1 minutę. Zabezpiecza to przed atakami brute-force. +2. Hasło użytkownika jest haszowane z wykorzystniem losowej soli oraz funkcji key-stretching która wynokuje 1000 iteracji. +3. Klucz do szyfrowania notatek algorymtm AES-256 jest generowany z hasła. Program wykorzystuje w tym celu PBKDF2 z HMAC-256. Liczba iteracji key-strethingu to 65536. +4. Szyforwanie notatni odbywa się w trybie CBC z losowym wektorem początkowym. +5. Przy każdej edycji/usunięciu/dodaniu notatni wszystkie dane zostają przeszyfrowane z wykorzystniem nowej soli oraz nowego wektora początkowego. Wpływa to co prawda na płynność działania aplikacji, lecz jej głównym celem jest zastosowanie mechanizmów krytpograficznych. + +### Zrzuty ekranu z działania aplikacji + +Register screen + +Main screen + +Create note + +Change password + +Delete note + + + + + + diff --git a/app/src/main/java/com/example/bsm_notatnik/MainActivity.java b/app/src/main/java/com/example/bsm_notatnik/MainActivity.java index 8e9edd9..44121ce 100644 --- a/app/src/main/java/com/example/bsm_notatnik/MainActivity.java +++ b/app/src/main/java/com/example/bsm_notatnik/MainActivity.java @@ -106,7 +106,7 @@ public class MainActivity extends AppCompatActivity { return; } - if(!validatePassword(newPassword)){ + if(!Utility.validatePassword(newPassword)){ Toast.makeText(MainActivity.this, "New password to weak!", Toast.LENGTH_SHORT).show(); return; } @@ -240,13 +240,7 @@ public class MainActivity extends AppCompatActivity { - private boolean validatePassword(String password){ - final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[A-Z])(.{8,})$"; - Pattern pattern = Pattern.compile(PASSWORD_PATTERN); - Matcher matcher = pattern.matcher(password); - return matcher.matches(); - } private void updatePassword(String hashedEmail, String newPassword) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, InvalidKeySpecException, BadPaddingException, InvalidKeyException { SharedPreferences sharedPreferences = getSharedPreferences(SHARED_NAME_CREDENTIALS, MODE_PRIVATE); @@ -306,12 +300,10 @@ public class MainActivity extends AppCompatActivity { } } - //tutaj muszę wygenerować randomowy iv. Używam go do enkrypcji i zapisuje do shared jako string IvParameterSpec iv = UtilityAES.generateIv(); String ivString = ivToString(iv); saveIvStringToShared(ivString); - //tutaj generuje randomową sól2 używam ją do enkrypcji i zapisuje do skared byte[] salt2Bytes = Utility.generateSalt(); String salt2String = bytesToSalt2String(salt2Bytes); saveSalt2StringToPrefs(salt2String); @@ -331,11 +323,9 @@ public class MainActivity extends AppCompatActivity { SharedPreferences sharedPreferences = getSharedPreferences(SHARED_NAME_NOTES, MODE_PRIVATE); int noteCount = sharedPreferences.getInt("notecount_" + HASHED_EMAIL, 0); - //tutaj muszę pobrać iv z shared i skonvertować do dobrego formatu String ivString = getIVStringFromShared(); IvParameterSpec iv = stringToIv(ivString); - //tutaj pobieram sól2 z shared i używam do dekrypcji String salt2String = getSalt2StringFromShared(); byte[] salt2Bytes = Salt2StringToBytes(salt2String); diff --git a/app/src/main/java/com/example/bsm_notatnik/Register.java b/app/src/main/java/com/example/bsm_notatnik/Register.java index 07541b6..6ae9ee7 100644 --- a/app/src/main/java/com/example/bsm_notatnik/Register.java +++ b/app/src/main/java/com/example/bsm_notatnik/Register.java @@ -36,27 +36,24 @@ public class Register extends AppCompatActivity { buttonReg = findViewById(R.id.btn_register); loginNowTextView = findViewById(R.id.loginNow); - //goes to login page loginNowTextView.setOnClickListener(view -> { Intent intent = new Intent(getApplicationContext(), Login.class); startActivity(intent); - finish(); // finishes current activity + finish(); }); - //when register button is clicked buttonReg.setOnClickListener(view -> { String email, hashedEmail, password, hashedPassword; email = String.valueOf(editTextEmail.getText()); password = String.valueOf(editTextPassword.getText()); - //checks if email field is not empty if (TextUtils.isEmpty(email)){ Toast.makeText(Register.this, "Enter email!", Toast.LENGTH_SHORT).show(); return; } - //checks if password field is not empty + if (TextUtils.isEmpty(password)){ Toast.makeText(Register.this, "Enter password!", Toast.LENGTH_SHORT).show(); return; @@ -64,22 +61,22 @@ public class Register extends AppCompatActivity { hashedEmail = Utility.hashEmail(email); - //checks if given username is already registered in database + if (checkIfUserExists(hashedEmail)){ editTextEmail.setText(""); editTextPassword.setText(""); Toast.makeText(Register.this, "Account with this username already exists!", Toast.LENGTH_SHORT).show(); return; } - //checks if email has correct format + if (!validateEmail(email)){ editTextPassword.setText(""); Toast.makeText(Register.this, "Email format not correct!", Toast.LENGTH_SHORT).show(); return; } - //checks password requirements - if (!validatePassword(password)){ - Toast.makeText(Register.this, "Password to weak!", Toast.LENGTH_SHORT).show(); + + if (!Utility.validatePassword(password)){ + Toast.makeText(Register.this, "Password to short! Must have at least 7 characters.", Toast.LENGTH_SHORT).show(); return; } diff --git a/app/src/main/java/com/example/bsm_notatnik/Utility.java b/app/src/main/java/com/example/bsm_notatnik/Utility.java index 4a945e2..5e95dec 100644 --- a/app/src/main/java/com/example/bsm_notatnik/Utility.java +++ b/app/src/main/java/com/example/bsm_notatnik/Utility.java @@ -7,6 +7,8 @@ import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import java.util.Base64; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; @@ -59,5 +61,9 @@ public class Utility { } } + protected static boolean validatePassword(String password){ + return password.length() > 6; + } + } diff --git a/app/src/main/java/com/example/bsm_notatnik/UtilityAES.java b/app/src/main/java/com/example/bsm_notatnik/UtilityAES.java index 09154f7..204380b 100644 --- a/app/src/main/java/com/example/bsm_notatnik/UtilityAES.java +++ b/app/src/main/java/com/example/bsm_notatnik/UtilityAES.java @@ -24,9 +24,8 @@ public class UtilityAES { SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 256); - SecretKey secret = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES"); - return secret; + return new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES"); } public static String encrypt(String algorithm, String input, SecretKey key, IvParameterSpec iv) throws diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 046b1ff..a6a8919 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -21,7 +21,7 @@ android:layout_weight="1" android:layout_marginEnd="8dp" android:background="@drawable/rectangular_button_background" - android:text="Log Out" /> + android:text="@string/log_out" />