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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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" />
+ android:text="@string/change_password" />
+ android:text="@string/add_note" />
@@ -46,7 +46,7 @@
android:layout_width="match_parent"
android:layout_height="18dp"
android:layout_marginTop="15dp"
- android:text="Notes:"
+ android:text="@string/notes"
android:textStyle="bold"/>
+ android:hint="@string/note_title"/>
diff --git a/app/src/main/res/layout/note_item.xml b/app/src/main/res/layout/note_item.xml
index 09fe786..be1ccaa 100644
--- a/app/src/main/res/layout/note_item.xml
+++ b/app/src/main/res/layout/note_item.xml
@@ -17,7 +17,7 @@
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
- android:text="Note Title"
+ android:text="@string/note_title"
/>
diff --git a/app/src/main/res/layout/password_change_dialog.xml b/app/src/main/res/layout/password_change_dialog.xml
index 2127926..713a07d 100644
--- a/app/src/main/res/layout/password_change_dialog.xml
+++ b/app/src/main/res/layout/password_change_dialog.xml
@@ -8,21 +8,21 @@
android:id="@+id/editTextOldPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:hint="Enter Old Password"
+ android:hint="@string/enter_old_password"
android:inputType="textPassword"/>
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index dcbe855..8b509bf 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -1,7 +1,5 @@
-
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2b868b6..c5ede5f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -9,4 +9,13 @@
Click to login
Click to register
logout
+ Log Out
+ Change Password
+ Add Note
+ Notes:
+ Note Title
+ Note Content
+ Enter Old Password
+ Enter New Password
+ Confirm New Password
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 16eeadf..521303e 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -3,5 +3,4 @@
-
\ No newline at end of file
diff --git a/screenshots/change_password.png b/screenshots/change_password.png
new file mode 100644
index 0000000..b8c0d06
Binary files /dev/null and b/screenshots/change_password.png differ
diff --git a/screenshots/create_note.png b/screenshots/create_note.png
new file mode 100644
index 0000000..ade655b
Binary files /dev/null and b/screenshots/create_note.png differ
diff --git a/screenshots/delete_note.png b/screenshots/delete_note.png
new file mode 100644
index 0000000..38ef2bc
Binary files /dev/null and b/screenshots/delete_note.png differ
diff --git a/screenshots/main_screen.png b/screenshots/main_screen.png
new file mode 100644
index 0000000..c67e223
Binary files /dev/null and b/screenshots/main_screen.png differ
diff --git a/screenshots/register.png b/screenshots/register.png
new file mode 100644
index 0000000..fff6388
Binary files /dev/null and b/screenshots/register.png differ