Today, we will build a Password and Notes Manager in Java with Swing. This application can be helpful in storing and managing passwords and notes for an individual.
Project Overview: Password and Notes Manager in Java
Project Name: | Password and Notes Manager in Java |
Abstract: | It’s a GUI-based project used with the swing library to organize all the elements that work under the Password and Notes Manager. |
Language Used: | Java |
IDE: | VS Code |
Java version (Recommended): | Java SE 18.0. 2.1 |
Database: | None |
Type: | Desktop Application |
Recommended for: | Intermediates of Java |
Time to build: | 2-3 hours |
Features
- Generate a random Password of a length >4
- Store and Retrieve passwords
- Delete a password
- Encrypt a plain text with a secret key
- Decrypt the encrypted text with the secret key
- Add a note and view the note added
Complete Code for Password and Notes Manager in Java
We have used an ArrayList to store the notes and a HashMap structure to store the name and password associated with the name. For encryption, we have used the PBEWithMD5AndDES algorithm.
Let’s start, first create a project folder and a file named PasswordMaganer.java. Download the images for the project from here and add these images to the project folder. Now paste the below lines of code into the file. Comments are provided for explanation.
import java.awt.*; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.security.SecureRandom; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import java.util.Base64; import javax.crypto.*; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; // This class is used to create a loading screen class SplashScreen { JFrame frame; JLabel image=new JLabel(new ImageIcon("key-lock.png")); JLabel text=new JLabel("PASSWORD & NOTES MANAGER"); JProgressBar progressBar=new JProgressBar(); JLabel message=new JLabel(); SplashScreen() { createGUI(); addImage(); addText(); addProgressBar(); runningPBar(); } public void createGUI(){ frame=new JFrame(); // to create a frame frame.getContentPane().setLayout(null); // to set the layout of the frame frame.setUndecorated(true); frame.setSize(400,400); // to set the size of the frame frame.setLocationRelativeTo(null); frame.getContentPane().setBackground(new Color(0XFF8787)); // to set the background color of the frame frame.setVisible(true); } public void addImage(){ image.setSize(400,200); // to set the size of the image frame.add(image); } public void addText() { text.setFont(new Font("MV Boli",Font.BOLD,20)); // to set the font of the text text.setBounds(30,200,400,30); text.setForeground(Color.black); frame.add(text); } public void addProgressBar(){ progressBar.setBounds(100,280,200,30); // to set the size of the progress bar progressBar.setBorderPainted(true); progressBar.setStringPainted(true); progressBar.setBackground(Color.black); progressBar.setForeground(new Color(0X38E54D)); progressBar.setValue(0); frame.add(progressBar); } public void runningPBar(){ int i=0;//Creating an integer variable and initializing it to 0 while( i<=100) { try{ Thread.sleep(40); //Pausing execution for 50 milliseconds progressBar.setValue(i); //Setting value of Progress Bar i++; if(i==100) frame.dispose(); }catch(Exception e){ e.printStackTrace(); } } } } //Linear Probing Implementation class HashtablePassword implements hashTableMap { private final int useProbe; //0 = Linear Probing, 1 = Quadratic Probing private Entry[] entries; //The array of entries private final float loadFactor; //The load factor private int size, used; //used acquires space for NIL private final Entry NIL = new Entry(null, null); //Deleted entries private static class Entry{ Object key, value; Entry(Object k, Object v){ key = k; value = v; } } public HashtablePassword(int capacity, float loadFactor, int useProbe){ entries = new Entry[capacity]; this.loadFactor = loadFactor; this.useProbe = useProbe; } //Complementary functions public int hash(Object key){ return (key.hashCode() & 0x7FFFFFFF) % entries.length; } private int nextProbe(int h, int i){ return (h+i) % entries.length; //Linear Probing } private void rehash(){ Entry[] oldEntries = entries; entries = new Entry[2*entries.length+1]; for (Entry entry : oldEntries) { if (entry == NIL || entry == null) continue; int h = hash(entry.key); for (int x = 0; x < entries.length; x++) { int j = nextProbe(h, x); if (entries[j] == null) { entries[j] = entry; break; } } used = size; } } @Override public int add_Acc(Object Account, Object passwd) { if(used > (loadFactor*entries.length))rehash(); int h = hash(Account); for (int i = 0; i < entries.length; i++){ int j = (h+i) % entries.length; Entry entry = entries[j]; if(entry==null){ entries[j]= new Entry(Account, passwd); ++size; ++used; return h; } if(entry == NIL)continue; if(entry.key.equals(Account)){ Object oldValue = entry.value; entries[j].value = passwd; return (int) oldValue; } } return h; } @Override public Object get_Acc(Object Account) { int h = hash(Account); for(int i = 0; i < entries.length; i++){ int j = nextProbe(h , i); Entry entry = entries[j]; if(entry == null)break; if(entry == NIL)continue; if(entry.key.equals(Account)) return entry.value; } return null; } @Override public Object remove_Acc(Object Account) { int h = hash(Account); for(int i = 0; i < entries.length; i++){ int j = nextProbe(h,i); Entry entry = entries[j]; if(entry == NIL)continue; if(entry.key.equals(Account)){ Object Value = entry.value; entries[j] = NIL; size--; return Value; } } return null; } } class CryptoUtil { Cipher ecipher; Cipher dcipher; // 8-byte Salt byte[] salt = { (byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32, (byte) 0x56, (byte) 0x35, (byte) 0xE3, (byte) 0x03 }; // Iteration count int iterationCount = 19; public CryptoUtil() { } /** * * @param secretKey Key used to encrypt data * @param plainText Text input to be encrypted * @return Returns encrypted text * @throws java.security.NoSuchAlgorithmException * @throws java.security.spec.InvalidKeySpecException * @throws javax.crypto.NoSuchPaddingException * @throws java.security.InvalidKeyException * @throws java.security.InvalidAlgorithmParameterException * @throws java.io.UnsupportedEncodingException * @throws javax.crypto.IllegalBlockSizeException * @throws javax.crypto.BadPaddingException * */ public String encrypt(String secretKey, String plainText) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException { //Key generation for enc and desc KeySpec keySpec = new PBEKeySpec(secretKey.toCharArray(), salt, iterationCount); SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec); // Prepare the parameter to the ciphers AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount); //Enc process ecipher = Cipher.getInstance(key.getAlgorithm()); ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); String charSet = "UTF-8"; byte[] in = plainText.getBytes(charSet); byte[] out = ecipher.doFinal(in); String encStr = new String(Base64.getEncoder().encode(out)); return encStr; } /** * @param secretKey Key used to decrypt data * @param encryptedText encrypted text input to decrypt * @return Returns plain text after decryption * @throws java.security.NoSuchAlgorithmException * @throws java.security.spec.InvalidKeySpecException * @throws javax.crypto.NoSuchPaddingException * @throws java.security.InvalidKeyException * @throws java.security.InvalidAlgorithmParameterException * @throws java.io.UnsupportedEncodingException * @throws javax.crypto.IllegalBlockSizeException * @throws javax.crypto.BadPaddingException */ public String decrypt(String secretKey, String encryptedText) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, IOException { //Key generation for enc and desc KeySpec keySpec = new PBEKeySpec(secretKey.toCharArray(), salt, iterationCount); SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec); // Prepare the parameter to the ciphers AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount); //Decryption process; same key will be used for decr dcipher = Cipher.getInstance(key.getAlgorithm()); dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec); byte[] enc = Base64.getDecoder().decode(encryptedText); byte[] utf8 = dcipher.doFinal(enc); String charSet = "UTF-8"; String plainStr = new String(utf8, charSet); return plainStr; } } class PasswordGenerator { private static final SecureRandom random = new SecureRandom(); private static final String caps="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final String small_caps="abcdefghijklmnopqrstuvwxyz"; private static final String Numeric="1234567890"; private static final String special_char="~!@#$%^&*(_+{}|:_[?]>=<"; private static final String dic = caps + small_caps + Numeric + special_char; public String generatePassword(int len) { StringBuilder password= new StringBuilder(); for (int i = 0; i <len ; i++) { int index = random.nextInt(dic.length()); password.append(dic.charAt(index)); } return password.toString(); } } interface hashTableMap { Object get_Acc(Object Account); int add_Acc(Object Account, Object passwd); Object remove_Acc(Object Account); } class PasswordManager implements ActionListener { //Store password class reference HashtablePassword data = new HashtablePassword(15,0.5F,0); // GUI variables declaration JFrame frame; JFrame frame2; JLabel background; Container conn1,conn2; JLabel lAcc,lPass; JTextArea encryptPasswdArea, genePassArea, searchPassArea; JButton PassGeneBtn,PassEncryptBtn, PassStoreBtn, PassSearchBtn, AccAddBtn, PassDeleteBtn; JTextField tAcc,tPass; JButton addNoteBtn; JLabel addNoteLabel; JTextArea tNote; JButton addNote; JFrame conn3; ArrayList<String> notes = new ArrayList<>(); // to store the notes in an array list of string type @Override public void actionPerformed(ActionEvent e) { } //Frame settings public static void FrameGUI(JFrame frame){ frame.setVisible(true); frame.setLayout(null); frame.setLocationRelativeTo(null); } //container settings public static void ContainerGUI(Container conn){ conn.setVisible(true); conn.setBackground(Color.getHSBColor(20.4f, 10.5f, 12.9f)); conn.setLayout(null); } // buttons settings public void GUIButtonsSetting(JButton btn){ btn.setBackground(new Color(0XFB2576)); btn.setForeground(Color.WHITE); btn.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3)); btn.setFocusable(false); Cursor crs = new Cursor(Cursor.HAND_CURSOR); btn.setCursor(crs); Font fn = new Font("MV Boli", Font.BOLD, 15); btn.setFont(fn); } //GUI of Store password public void StoringGUI() { frame2 = new JFrame("Store your passwords"); frame2.setBounds(1400, 300, 800, 500); frame2.setSize(400,400); FrameGUI(frame2); conn2 = frame2.getContentPane(); ContainerGUI(conn2); Font fn = new Font("MV Boli", Font.BOLD, 20); //Account textFiled and label lAcc = new JLabel("ACCOUNT NAME"); lAcc.setBounds(90, 23, 380, 20); lAcc.setFont(fn); conn2.add(lAcc); tAcc = new JTextField(); tAcc.setBounds(90,70,200,50); tAcc.setFont(fn); tAcc.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3)); tAcc.setForeground(Color.DARK_GRAY); conn2.add(tAcc); //Account password textField and label lPass = new JLabel("ACCOUNT PASSWORD"); lPass.setBounds(90, 160, 380, 20); lPass.setFont(fn); conn2.add(lPass); tPass = new JTextField(); tPass.setBounds(90,200,200,50); tPass.setFont(fn); tPass.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3)); tPass.setForeground(Color.DARK_GRAY); conn2.add(tPass); AccAddBtn = new JButton("STORE"); AccAddBtn.setBounds(120, 290, 150, 50); conn2.add(AccAddBtn); GUIButtonsSetting(AccAddBtn); } //for password generator and encryption public void textArea(String Pass,JTextArea TA){ TA.setText(Pass); Font fn = new Font("MV Boli", Font.BOLD, 20); TA.setWrapStyleWord(true); TA.setLineWrap(true); TA.setCaretPosition(0); TA.setEditable(false); TA.setFont(fn); } //GUI of Password Manager PasswordManager() { frame = new JFrame("Password Manager"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400,650); frame.setResizable(false); ImageIcon img = new ImageIcon("background.png"); background = new JLabel("",img,JLabel.CENTER); background.setBounds(0,0,400,650); background.setVisible(true); frame.add(background); FrameGUI(frame); conn1 = frame.getContentPane(); ContainerGUI(conn1); //Generator buttons settings PassGeneBtn = new JButton("GENERATE PASSWORD"); PassGeneBtn.setBounds(90, 20, 220, 40); conn1.add(PassGeneBtn); GUIButtonsSetting(PassGeneBtn); //generating password PassGeneBtn.addActionListener(e -> { if(PassGeneBtn ==e.getSource()) { try{ int len = Integer.parseInt(JOptionPane.showInputDialog("Enter the password length")); if(len>4) { // password generator class reference PasswordGenerator pass = new PasswordGenerator(); String passwd = pass.generatePassword(len); genePassArea = new JTextArea(5,4); textArea(passwd,genePassArea); JOptionPane.showMessageDialog(conn1,new JScrollPane(genePassArea),"Copy your password",JOptionPane.INFORMATION_MESSAGE); } else JOptionPane.showMessageDialog (conn1,"Password length must be greater than 8!","Invalid Input Error",JOptionPane.WARNING_MESSAGE); } catch(Exception ex){JOptionPane.showMessageDialog(conn1,"Write something","EXIT!",JOptionPane.ERROR_MESSAGE);} } } ); // add a encryption button and action JButton EncryptBtn = new JButton("ENCRYPT Text"); EncryptBtn.setBounds(90, 90, 220, 40); conn1.add(EncryptBtn); GUIButtonsSetting(EncryptBtn); EncryptBtn.addActionListener(e -> { if(EncryptBtn ==e.getSource()) { try{ String text = JOptionPane.showInputDialog("Enter the text to encrypt"); String secretKey = JOptionPane.showInputDialog("Enter the secret key"); if(text.length()>0 && secretKey.length()>0) { // password generator class reference CryptoUtil pass1 = new CryptoUtil(); String passwd = pass1.encrypt(secretKey, text); // encrypting the text genePassArea = new JTextArea(5,4); // text area for the encrypted text textArea(passwd,genePassArea); // setting the text area JOptionPane.showMessageDialog(conn1,new JScrollPane(genePassArea),"Copy your password",JOptionPane.INFORMATION_MESSAGE); // showing the encrypted text } else JOptionPane.showMessageDialog (conn1,"Write something","Invalid Input Error",JOptionPane.WARNING_MESSAGE); } catch(Exception ex){JOptionPane.showMessageDialog(conn1,"Write something","EXIT!",JOptionPane.ERROR_MESSAGE);} } } ); // add a decryption button and action JButton DecryptBtn = new JButton("DECRYPT Text"); DecryptBtn.setBounds(90, 160, 220, 40); conn1.add(DecryptBtn); GUIButtonsSetting(DecryptBtn); DecryptBtn.addActionListener(e -> { if(DecryptBtn ==e.getSource()) { try{ String text = JOptionPane.showInputDialog("Enter the text to decrypt"); // getting the encrypted text String secretKey = JOptionPane.showInputDialog("Enter the secret key"); // getting the secret key if(text.length()>0 && secretKey.length()>0) // checking if the text and secret key is not empty { // password generator class reference CryptoUtil pass1 = new CryptoUtil(); // creating a object of the CryptoUtil class String passwd = pass1.decrypt(secretKey, text); // decrypting the text genePassArea = new JTextArea(5,4); // text area for the decrypted text textArea(passwd,genePassArea); // setting the text area JOptionPane.showMessageDialog(conn1,new JScrollPane(genePassArea),"Decrypted text",JOptionPane.INFORMATION_MESSAGE); // showing the decrypted text } else JOptionPane.showMessageDialog (conn1,"Password length must be greater than 8!","Invalid Input Error",JOptionPane.WARNING_MESSAGE); } catch(Exception ex){JOptionPane.showMessageDialog(conn1,"Write something","EXIT!",JOptionPane.ERROR_MESSAGE);} } } ); //storing password using hashtable PassStoreBtn = new JButton("STORE PASSWORD"); PassStoreBtn.setBounds(90, 230, 220, 40); conn1.add(PassStoreBtn); GUIButtonsSetting(PassStoreBtn); //Store password action PassStoreBtn.addActionListener(e -> { if(PassStoreBtn ==e.getSource()) { try{ StoringGUI(); // action on the Store btn AccAddBtn.addActionListener(e4 -> { if (AccAddBtn == e4.getSource()) { String account_name = tAcc.getText(); // getting the account name String acc_pass = tPass.getText(); // getting the password if (account_name.isEmpty() && acc_pass.isEmpty()) { JOptionPane.showMessageDialog(conn2,"unable to store your password!","ERROR",JOptionPane.ERROR_MESSAGE); } else{ //calling put method of the hashtablePassword class data.add_Acc(account_name,acc_pass); // adding the account name and password to the hashtable JOptionPane.showMessageDialog(conn2, "Account added Successfully !"); tAcc.setText(null); tPass.setText(null); } } } ); } catch(Exception ex) {JOptionPane.showMessageDialog(conn2,"Write something","EXIT",JOptionPane.ERROR_MESSAGE);} } } ); //searching password PassSearchBtn = new JButton("SEARCH PASSWORD"); GUIButtonsSetting(PassSearchBtn); PassSearchBtn.setBounds(90, 300, 220, 40); conn1.add(PassSearchBtn); PassSearchBtn.addActionListener(e ->{ if (PassSearchBtn ==e.getSource()){ try{ String acc_name = JOptionPane.showInputDialog("Enter your Account Name"); // getting the account name if (!acc_name.isBlank()) { // checking if the account name is not empty Object pass = data.get_Acc(acc_name.toLowerCase()); // getting the password of the account name if(pass!=null) { // checking if the password is not null searchPassArea = new JTextArea(4,5); // text area for the password textArea(String.valueOf(pass), searchPassArea); // setting the text area JOptionPane.showMessageDialog(conn1, new JScrollPane(searchPassArea), "Copy your password", JOptionPane.INFORMATION_MESSAGE); } else JOptionPane.showMessageDialog(conn1, "Account not Found!"); } } catch (Exception ex){ JOptionPane.showMessageDialog(conn1,"Write something","EXIT",JOptionPane.ERROR_MESSAGE); } } } ); // deleting password PassDeleteBtn = new JButton("DELETE PASSWORD"); GUIButtonsSetting(PassDeleteBtn); PassDeleteBtn.setBounds(90, 370, 220, 40); conn1.add(PassDeleteBtn); PassDeleteBtn.addActionListener(e -> { if (PassDeleteBtn == e.getSource()) { try { String acc_name = JOptionPane.showInputDialog("Enter the Account Name"); // getting the account name if (!acc_name.isBlank()) { data.remove_Acc(acc_name.toLowerCase()); // removing the account name and password from the hashtable JOptionPane.showMessageDialog(conn1, "Delete successfully!"); // showing the message } else JOptionPane.showMessageDialog(conn1, "Account not found!", "INFO", JOptionPane.INFORMATION_MESSAGE); } catch (Exception ex) { JOptionPane.showMessageDialog(conn1, "Write something", "EXIT", JOptionPane.ERROR_MESSAGE); } } } ); addNoteBtn = new JButton("ADD NOTE"); GUIButtonsSetting(addNoteBtn); addNoteBtn.setBounds(90, 440, 220, 40); conn1.add(addNoteBtn); addNoteBtn.addActionListener(e -> { if (addNoteBtn == e.getSource()) { try { NoteGUI(); // action on the add note btn addNote.addActionListener(e4 -> { if (addNote == e4.getSource()) { String note = tNote.getText(); // getting the note if (note.isEmpty()) { JOptionPane.showMessageDialog(conn3, "unable to store your note!", "ERROR", JOptionPane.ERROR_MESSAGE); } else { //calling put method of the hashtablePassword class notes.add(note); // adding the note to the arraylist JOptionPane.showMessageDialog(conn3, "Note added Successfully !"); conn3.setVisible(false); tNote.setText(null); } } }); } catch (Exception ex) { JOptionPane.showMessageDialog(conn3, "Write something", "EXIT", JOptionPane.ERROR_MESSAGE); } } } ); //get all notes JButton getNoteBtn = new JButton("GET NOTE"); GUIButtonsSetting(getNoteBtn); getNoteBtn.setBounds(90, 510, 220, 40); conn1.add(getNoteBtn); getNoteBtn.addActionListener(e -> { if (getNoteBtn == e.getSource()) { try { String allNotes = notes.get(notes.size() - 1); // getting the last note added if (allNotes.isEmpty()) { // checking if the note is empty or not JOptionPane.showMessageDialog(conn1, "No note found!", "INFO", JOptionPane.INFORMATION_MESSAGE); // showing the message } else { searchPassArea = new JTextArea(4, 5); // text area for the note textArea(allNotes, searchPassArea); // setting the text area JOptionPane.showMessageDialog(conn1, new JScrollPane(searchPassArea), "Get your notes", JOptionPane.INFORMATION_MESSAGE); // showing the message } } catch (Exception ex) { JOptionPane.showMessageDialog(conn1, "Add a note before trying to retrive", "EXIT", JOptionPane.ERROR_MESSAGE); } } } ); } // method for setting the buttons and GUI for adding notes private void NoteGUI() { conn3 = new JFrame("Add Note"); conn3.setSize(500, 500); conn3.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); conn3.setLocationRelativeTo(null); conn3.setLayout(null); conn3.setVisible(true); conn3.setResizable(false); //add note label addNoteLabel = new JLabel("Add Note"); addNoteLabel.setBounds(200, 20, 100, 30); conn3.add(addNoteLabel); //add note text area tNote = new JTextArea(10, 10); tNote.setBounds(100, 60, 300, 300); conn3.add(tNote); //add note button addNote = new JButton("ADD NOTE"); GUIButtonsSetting(addNote); addNote.setBounds(140, 380, 220, 30); conn3.add(addNote); } // main method to run the application public static void main(String[] args) { //loading screen class new SplashScreen(); try { new PasswordManager(); }catch (Exception ex) { ex.printStackTrace(); } } }
Output for Password and Notes Manager in Java:
Image Output:
Video Output:
Conclusion
There we have it!! We just created a Password and Notes Manager in Java. Hope you enjoyed and learned something. You can further extend this project to storing more information about the user and also change the UI according to you.
Thank you for visiting our website.
Also Read:
- Dino Game in Java
- Java Games Code | Copy And Paste
- Supply Chain Management System in Java
- Survey Management System In Java
- Phone Book in Java
- Email Application in Java
- Inventory Management System Project in Java
- Blood Bank Management System Project in Java
- Electricity Bill Management System Project in Java
- CGPA Calculator App In Java
- Chat Application in Java
- 100+ Java Projects for Beginners 2023
- Airline Reservation System Project in Java
- Password and Notes Manager in Java
- GUI Number Guessing Game in Java
- How to create Notepad in Java?
- Memory Game in Java
- Simple Car Race Game in Java
- ATM program in Java
- Drawing Application In Java
- Tetris Game in Java
- Pong Game in Java
- Hospital Management System Project in Java
- Ludo Game in Java
- Restaurant Management System Project in Java
- Flappy Bird Game in Java
- ATM Simulator In Java
- Brick Breaker Game in Java
- Best Java Roadmap for Beginners 2023
- Snake Game in Java