From cd186b1491c2fb24da91aece6757605a73feaa2a Mon Sep 17 00:00:00 2001 From: Jatin <75193966+oyejateen@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:57:54 -0800 Subject: [PATCH 1/6] Create PasswordManager.java --- PasswordManager/PasswordManager.java | 356 +++++++++++++++++++++++++++ 1 file changed, 356 insertions(+) create mode 100644 PasswordManager/PasswordManager.java diff --git a/PasswordManager/PasswordManager.java b/PasswordManager/PasswordManager.java new file mode 100644 index 0000000..41bb59d --- /dev/null +++ b/PasswordManager/PasswordManager.java @@ -0,0 +1,356 @@ +import javax.swing.table.*; +class NewJFrame extends javax.swing.JFrame { + public NewJFrame() { + initComponents(); + } + + DefaultTableModel dm = new DefaultTableModel(); + + @SuppressWarnings("unchecked") + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + jTabbedPane1 = new javax.swing.JTabbedPane(); + jPanel1 = new javax.swing.JPanel(); + jScrollPane1 = new javax.swing.JScrollPane(); + jTable1 = new javax.swing.JTable(); + jPanel2 = new javax.swing.JPanel(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + jTextField2 = new javax.swing.JTextField(); + jButton1 = new javax.swing.JButton(); + jLabel5 = new javax.swing.JLabel(); + jTextField3 = new javax.swing.JTextField(); + jTextField1 = new javax.swing.JTextField(); + jSeparator1 = new javax.swing.JSeparator(); + jLabel4 = new javax.swing.JLabel(); + jLabel6 = new javax.swing.JLabel(); + jLabel7 = new javax.swing.JLabel(); + jTextField4 = new javax.swing.JTextField(); + jButton2 = new javax.swing.JButton(); + jPanel3 = new javax.swing.JPanel(); + jLabel8 = new javax.swing.JLabel(); + + setLocation(500, 250); + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + + jLabel1.setBackground(new java.awt.Color(189, 147, 249)); + jLabel1.setFont(new java.awt.Font("Droid Sans", 1, 24)); // NOI18N + jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel1.setText("Password Manager"); + + jTable1.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null} + }, + new String [] { + "No", "Name", "Username", "Password" + } + ) { + Class[] types = new Class [] { + java.lang.Integer.class, java.lang.String.class, java.lang.String.class, java.lang.String.class + }; + boolean[] canEdit = new boolean [] { + false, false, true, false + }; + + public Class getColumnClass(int columnIndex) { + return types [columnIndex]; + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return canEdit [columnIndex]; + } + }); + jTable1.setToolTipText(""); + jTable1.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + jTable1MouseClicked(evt); + } + }); + jScrollPane1.setViewportView(jTable1); + if (jTable1.getColumnModel().getColumnCount() > 0) { + jTable1.getColumnModel().getColumn(0).setResizable(false); + jTable1.getColumnModel().getColumn(0).setPreferredWidth(5); + jTable1.getColumnModel().getColumn(1).setResizable(false); + jTable1.getColumnModel().getColumn(2).setResizable(false); + jTable1.getColumnModel().getColumn(3).setResizable(false); + } + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE) + ); + + jTabbedPane1.addTab("All Items", jPanel1); + + jLabel2.setText("Username"); + + jLabel3.setText("Password"); + + jTextField2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jTextField2ActionPerformed(evt); + } + }); + + jButton1.setText("Add"); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + jLabel5.setText("Name"); + + jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL); + + jLabel4.setText("Add Item"); + + jLabel6.setText("Remove Item"); + + jLabel7.setText("Id"); + + jButton2.setText("Remove"); + jButton2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton2ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGap(19, 19, 19) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel2) + .addComponent(jLabel5) + .addComponent(jLabel3)) + .addGap(35, 35, 35) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jTextField2) + .addComponent(jTextField3) + .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE))) + .addComponent(jButton1) + .addComponent(jLabel4)) + .addGap(55, 55, 55) + .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel6) + .addGroup(jPanel2Layout.createSequentialGroup() + .addComponent(jLabel7) + .addGap(67, 67, 67) + .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jButton2)) + .addContainerGap(124, Short.MAX_VALUE)) + ); + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGap(20, 20, 20) + .addComponent(jLabel4) + .addGap(18, 18, 18) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel5)) + .addGap(18, 18, 18) + .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(18, 18, Short.MAX_VALUE) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel3) + .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(30, 30, 30) + .addComponent(jButton1) + .addGap(76, 76, 76)) + .addComponent(jSeparator1) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGap(23, 23, 23) + .addComponent(jLabel6) + .addGap(18, 18, 18) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel7) + .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(28, 28, 28) + .addComponent(jButton2) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + jTabbedPane1.addTab("Add Item", jPanel2); + + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); + jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addGap(50, 50, 50) + .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(348, Short.MAX_VALUE)) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addGap(40, 40, 40) + .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(195, Short.MAX_VALUE)) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jTabbedPane1) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + } + + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { + // TODO add your handling code here: + logArr[i] = new Login(jTextField1.getText(), jTextField2.getText(), jTextField3.getText()); + i++; + updateTable(); + } + + private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) { + // TODO add your handling code here: + } + + private void jTable1MouseClicked(java.awt.event.MouseEvent evt) { + // TODO add your handling code here: + } + + private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { + // TODO add your handling code here: + int index = Integer.parseInt(jTextField4.getText()); + if(index <= i){ + for(int n=index-1; n< i-1; n++){ + logArr[n] = logArr[n+1]; + } + logArr[i-1] = null; + i--; + updateTable(); + } + } + + private void updateTable() { + int j = 0; + + for(j=0; j<20; j++){ + jTable1.setValueAt("", j, 0); + jTable1.setValueAt("", j, 1); + jTable1.setValueAt("", j, 2); + jTable1.setValueAt("", j, 3); + } + + for (j = 0; j < i; j++) { + jTable1.setValueAt(j + 1, j, 0); + jTable1.setValueAt(logArr[j].name, j, 1); + jTable1.setValueAt(logArr[j].username, j, 2); + jTable1.setValueAt(logArr[j].password, j, 3); + + } + } + + class Login { + + String name, username, password; + + Login(String n, String uname, String pass) { + name = n; + username = uname; + password = pass; + } + } + + Login logArr[] = new Login[20]; + int i = 0; + + public static void main(String args[]) { + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Darcula".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new NewJFrame().setVisible(true); + } + }); + } + + private javax.swing.JButton jButton1; + private javax.swing.JButton jButton2; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JLabel jLabel7; + private javax.swing.JLabel jLabel8; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JPanel jPanel3; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JSeparator jSeparator1; + private javax.swing.JTabbedPane jTabbedPane1; + private javax.swing.JTable jTable1; + private javax.swing.JTextField jTextField1; + private javax.swing.JTextField jTextField2; + private javax.swing.JTextField jTextField3; + private javax.swing.JTextField jTextField4; +} From 9e190e43efdae10c66e4accb181578d774a5cb13 Mon Sep 17 00:00:00 2001 From: Jatin <75193966+oyejateen@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:58:06 -0800 Subject: [PATCH 2/6] Add files via upload --- PasswordManager/background.png | Bin 0 -> 16719 bytes PasswordManager/key-lock.png | Bin 0 -> 5376 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 PasswordManager/background.png create mode 100644 PasswordManager/key-lock.png diff --git a/PasswordManager/background.png b/PasswordManager/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f395315004633edca2c25a8cb844b5e2b3fb0ff9 GIT binary patch literal 16719 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 literal 0 HcmV?d00001 From 076f253e42990cf6183ababa6f790c414dd439d5 Mon Sep 17 00:00:00 2001 From: Jatin <75193966+oyejateen@users.noreply.github.com> Date: Sat, 24 Feb 2024 23:08:14 -0800 Subject: [PATCH 3/6] Create readme.md --- PasswordManager/readme.md | 101 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 PasswordManager/readme.md diff --git a/PasswordManager/readme.md b/PasswordManager/readme.md new file mode 100644 index 0000000..df28ab9 --- /dev/null +++ b/PasswordManager/readme.md @@ -0,0 +1,101 @@ +# 📝 Password Manager Application + +This is a simple password manager application developed in Java using Swing GUI. + +## 🚀 Features + +- Add, view, and remove login credentials. +- User-friendly interface. +- Dark theme using the Darcula look and feel. + +## 🖥️ Screenshots + +Include screenshots here if applicable. + +## 🛠️ Installation + +1. Clone the repository. +2. Open the project in your Java IDE. +3. Build and run the project. + +## 📚 Usage + +- **Add Item Tab**: Enter the name, username, and password, then click the "Add" button to add credentials. +- **All Items Tab**: View all saved credentials. Double-click on a row to edit the credentials. +- **Remove Item Tab**: Enter the ID of the credential you want to remove, then click the "Remove" button. + +## 💡 How It Works + +- The application uses Swing components to create a graphical user interface. +- Credentials are stored in an array of custom `Login` objects. +- The `DefaultTableModel` is used to display and manage data in the JTable. + +To run the Java application provided, you'll need to follow these steps: + +### Prerequisites: +- Make sure you have Java Development Kit (JDK) installed on your system. You can download it from the [official Oracle website](https://www.oracle.com/java/technologies/javase-jdk11-downloads.html) or use OpenJDK. + +### Steps to Run: + +1. **Clone the Repository:** + ```bash + git clone https://github.com/your-username/repository-name.git + ``` + Replace `your-username` and `repository-name` with your GitHub username and the name of the repository, respectively. + +2. **Navigate to the Project Directory:** + ```bash + cd repository-name + ``` + +3. **Compile the Java Code:** + ```bash + javac NewJFrame.java + ``` + +4. **Run the Application:** + ```bash + java NewJFrame + ``` + +5. **Interact with the Application:** + Once the application starts running, you should see the Password Manager interface. You can interact with the different tabs to add, view, and remove login credentials. + +6. **Close the Application:** + Close the application window when you're finished using it. + +### Additional Notes: + +- Make sure to have a compatible Java Development Kit (JDK) version installed on your system. +- If you encounter any errors during compilation or execution, double-check the steps and ensure that your environment is properly set up. +- If you're using an Integrated Development Environment (IDE) like IntelliJ IDEA or Eclipse, you can also import the project directly into the IDE and run it from there. + +Following these steps should allow you to successfully compile and run the Java application provided. If you encounter any issues, feel free to ask for further assistance! + +## 🤝 Contributing + +We welcome contributions from the community! If you'd like to contribute to the development of this project, please follow these guidelines: + +### 🛠️ How to Contribute + +1. **Fork the repository**: Click the "Fork" button on the top right corner of this repository's page to create your own copy. +2. **Clone the repository**: Clone your forked repository to your local machine using the following command: + ```bash + git clone https://github.com/your-username/repository-name.git + ``` +3. **Create a new branch**: Move into the repository's directory on your local machine and create a new branch for your contribution: + ```bash + git checkout -b feature/your-feature-name + ``` +4. **Make your changes**: Make the necessary changes and improvements to the project codebase. +5. **Commit your changes**: Once you're satisfied with your changes, commit them with a descriptive commit message: + ```bash + git commit -am 'Add a brief description of your changes' + ``` +6. **Push your changes**: Push your changes to your forked repository: + ```bash + git push origin feature/your-feature-name + ``` +7. **Submit a pull request**: Go to the original repository on GitHub and click the "New pull request" button. Describe your changes in detail and submit your pull request. + + From 693732dbcb5e81eca839e86a0019ea904d8e480b Mon Sep 17 00:00:00 2001 From: Jatin <75193966+oyejateen@users.noreply.github.com> Date: Sat, 24 Feb 2024 23:09:46 -0800 Subject: [PATCH 4/6] Update PasswordManager.java --- PasswordManager/PasswordManager.java | 534 +++++++++++---------------- 1 file changed, 215 insertions(+), 319 deletions(-) diff --git a/PasswordManager/PasswordManager.java b/PasswordManager/PasswordManager.java index 41bb59d..4615748 100644 --- a/PasswordManager/PasswordManager.java +++ b/PasswordManager/PasswordManager.java @@ -1,356 +1,252 @@ -import javax.swing.table.*; -class NewJFrame extends javax.swing.JFrame { - public NewJFrame() { - initComponents(); +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.NoSuchAlgorithmException; +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(); } - DefaultTableModel dm = new DefaultTableModel(); - - @SuppressWarnings("unchecked") - private void initComponents() { - - jLabel1 = new javax.swing.JLabel(); - jTabbedPane1 = new javax.swing.JTabbedPane(); - jPanel1 = new javax.swing.JPanel(); - jScrollPane1 = new javax.swing.JScrollPane(); - jTable1 = new javax.swing.JTable(); - jPanel2 = new javax.swing.JPanel(); - jLabel2 = new javax.swing.JLabel(); - jLabel3 = new javax.swing.JLabel(); - jTextField2 = new javax.swing.JTextField(); - jButton1 = new javax.swing.JButton(); - jLabel5 = new javax.swing.JLabel(); - jTextField3 = new javax.swing.JTextField(); - jTextField1 = new javax.swing.JTextField(); - jSeparator1 = new javax.swing.JSeparator(); - jLabel4 = new javax.swing.JLabel(); - jLabel6 = new javax.swing.JLabel(); - jLabel7 = new javax.swing.JLabel(); - jTextField4 = new javax.swing.JTextField(); - jButton2 = new javax.swing.JButton(); - jPanel3 = new javax.swing.JPanel(); - jLabel8 = new javax.swing.JLabel(); - - setLocation(500, 250); - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - - jLabel1.setBackground(new java.awt.Color(189, 147, 249)); - jLabel1.setFont(new java.awt.Font("Droid Sans", 1, 24)); // NOI18N - jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel1.setText("Password Manager"); - - jTable1.setModel(new javax.swing.table.DefaultTableModel( - new Object [][] { - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null} - }, - new String [] { - "No", "Name", "Username", "Password" - } - ) { - Class[] types = new Class [] { - java.lang.Integer.class, java.lang.String.class, java.lang.String.class, java.lang.String.class - }; - boolean[] canEdit = new boolean [] { - false, false, true, false - }; - - public Class getColumnClass(int columnIndex) { - return types [columnIndex]; - } - - public boolean isCellEditable(int rowIndex, int columnIndex) { - return canEdit [columnIndex]; - } - }); - jTable1.setToolTipText(""); - jTable1.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - jTable1MouseClicked(evt); - } - }); - jScrollPane1.setViewportView(jTable1); - if (jTable1.getColumnModel().getColumnCount() > 0) { - jTable1.getColumnModel().getColumn(0).setResizable(false); - jTable1.getColumnModel().getColumn(0).setPreferredWidth(5); - jTable1.getColumnModel().getColumn(1).setResizable(false); - jTable1.getColumnModel().getColumn(2).setResizable(false); - jTable1.getColumnModel().getColumn(3).setResizable(false); - } - - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE) - ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE) - ); - - jTabbedPane1.addTab("All Items", jPanel1); + 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); + } - jLabel2.setText("Username"); + public void addImage() { + image.setSize(400, 200); // to set the size of the image + frame.add(image); + } - jLabel3.setText("Password"); + 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); + } - jTextField2.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jTextField2ActionPerformed(evt); - } - }); + 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); + } - jButton1.setText("Add"); - jButton1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton1ActionPerformed(evt); + 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(); } - }); + } + } +} - jLabel5.setText("Name"); +class PasswordStrengthChecker { + public boolean isStrong(String password) { + // Implement your password strength checking logic here + // For example, you can check the length, presence of uppercase, lowercase, + // digits, and special characters + // For simplicity, let's consider a password strong if it has at least 8 characters + return password.length() >= 8; + } +} - jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL); +interface hashTableMap { + Object get_Acc(Object Account); - jLabel4.setText("Add Item"); + int add_Acc(Object Account, Object passwd); - jLabel6.setText("Remove Item"); + Object remove_Acc(Object Account); +} - jLabel7.setText("Id"); +class HashtablePassword implements hashTableMap { + 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 - jButton2.setText("Remove"); - jButton2.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton2ActionPerformed(evt); - } - }); + private static class Entry { + Object key, value; - javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); - jPanel2.setLayout(jPanel2Layout); - jPanel2Layout.setHorizontalGroup( - jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addGap(19, 19, 19) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel2) - .addComponent(jLabel5) - .addComponent(jLabel3)) - .addGap(35, 35, 35) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(jTextField2) - .addComponent(jTextField3) - .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE))) - .addComponent(jButton1) - .addComponent(jLabel4)) - .addGap(55, 55, 55) - .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel6) - .addGroup(jPanel2Layout.createSequentialGroup() - .addComponent(jLabel7) - .addGap(67, 67, 67) - .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(jButton2)) - .addContainerGap(124, Short.MAX_VALUE)) - ); - jPanel2Layout.setVerticalGroup( - jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addGap(20, 20, 20) - .addComponent(jLabel4) - .addGap(18, 18, 18) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel5)) - .addGap(18, 18, 18) - .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(18, 18, Short.MAX_VALUE) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jLabel3) - .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(30, 30, 30) - .addComponent(jButton1) - .addGap(76, 76, 76)) - .addComponent(jSeparator1) - .addGroup(jPanel2Layout.createSequentialGroup() - .addGap(23, 23, 23) - .addComponent(jLabel6) - .addGap(18, 18, 18) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel7) - .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(28, 28, 28) - .addComponent(jButton2) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - jTabbedPane1.addTab("Add Item", jPanel2); - - javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); - jPanel3.setLayout(jPanel3Layout); - jPanel3Layout.setHorizontalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(50, 50, 50) - .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(348, Short.MAX_VALUE)) - ); - jPanel3Layout.setVerticalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(40, 40, 40) - .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(195, Short.MAX_VALUE)) - ); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jTabbedPane1) - .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - pack(); + Entry(Object k, Object v) { + key = k; + value = v; + } } - private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { - // TODO add your handling code here: - logArr[i] = new Login(jTextField1.getText(), jTextField2.getText(), jTextField3.getText()); - i++; - updateTable(); + public HashtablePassword(int capacity, float loadFactor) { + entries = new Entry[capacity]; + this.loadFactor = loadFactor; } - private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) { - // TODO add your handling code here: + // Complementary functions + @Override + public int add_Acc(Object Account, Object passwd) { + // Your implementation to add account and password to the hash table + return 0; // Dummy return value } - private void jTable1MouseClicked(java.awt.event.MouseEvent evt) { - // TODO add your handling code here: + @Override + public Object get_Acc(Object Account) { + // Your implementation to get password from the hash table + return null; // Dummy return value } - private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { - // TODO add your handling code here: - int index = Integer.parseInt(jTextField4.getText()); - if(index <= i){ - for(int n=index-1; n< i-1; n++){ - logArr[n] = logArr[n+1]; - } - logArr[i-1] = null; - i--; - updateTable(); - } + @Override + public Object remove_Acc(Object Account) { + // Your implementation to remove account and password from the hash table + return null; // Dummy return value } +} - private void updateTable() { - int j = 0; - - for(j=0; j<20; j++){ - jTable1.setValueAt("", j, 0); - jTable1.setValueAt("", j, 1); - jTable1.setValueAt("", j, 2); - jTable1.setValueAt("", j, 3); - } +class PasswordManager implements ActionListener { + + // Store password class reference + HashtablePassword data = new HashtablePassword(15, 0.5F); + + // GUI variables declaration + JFrame frame; + JLabel background; + Container conn1; + JButton PassStoreBtn, PassSearchBtn, PassDeleteBtn; + + PasswordManager() { + frame = new JFrame("Password Manager"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(400, 400); + frame.setResizable(false); + ImageIcon img = new ImageIcon("background.png"); + background = new JLabel("", img, JLabel.CENTER); + background.setBounds(0, 0, 400, 400); + background.setVisible(true); + frame.add(background); + + FrameGUI(frame); + + conn1 = frame.getContentPane(); + ContainerGUI(conn1); + + // Store password button settings + PassStoreBtn = new JButton("STORE PASSWORD"); + PassStoreBtn.setBounds(90, 90, 220, 40); + conn1.add(PassStoreBtn); + GUIButtonsSetting(PassStoreBtn); + // Store password action + PassStoreBtn.addActionListener(e -> { + if (PassStoreBtn == e.getSource()) { + try { + // Implement storing password logic here + } catch (Exception ex) { + JOptionPane.showMessageDialog(conn1, "Error storing password", "Error", JOptionPane.ERROR_MESSAGE); + } + } + }); - for (j = 0; j < i; j++) { - jTable1.setValueAt(j + 1, j, 0); - jTable1.setValueAt(logArr[j].name, j, 1); - jTable1.setValueAt(logArr[j].username, j, 2); - jTable1.setValueAt(logArr[j].password, j, 3); + // Search password button settings + PassSearchBtn = new JButton("SEARCH PASSWORD"); + PassSearchBtn.setBounds(90, 160, 220, 40); + conn1.add(PassSearchBtn); + GUIButtonsSetting(PassSearchBtn); + // Search password action + PassSearchBtn.addActionListener(e -> { + if (PassSearchBtn == e.getSource()) { + try { + // Implement searching password logic here + } catch (Exception ex) { + JOptionPane.showMessageDialog(conn1, "Error searching password", "Error", JOptionPane.ERROR_MESSAGE); + } + } + }); - } + // Delete password button settings + PassDeleteBtn = new JButton("DELETE PASSWORD"); + PassDeleteBtn.setBounds(90, 230, 220, 40); + conn1.add(PassDeleteBtn); + GUIButtonsSetting(PassDeleteBtn); + // Delete password action + PassDeleteBtn.addActionListener(e -> { + if (PassDeleteBtn == e.getSource()) { + try { + // Implement deleting password logic here + } catch (Exception ex) { + JOptionPane.showMessageDialog(conn1, "Error deleting password", "Error", JOptionPane.ERROR_MESSAGE); + } + } + }); } - class Login { + // Frame settings + public static void FrameGUI(JFrame frame) { + frame.setVisible(true); + frame.setLayout(null); + frame.setLocationRelativeTo(null); + } - String name, username, password; + // Container settings + public static void ContainerGUI(Container conn) { + conn.setVisible(true); + conn.setBackground(Color.getHSBColor(20.4f, 10.5f, 12.9f)); + conn.setLayout(null); + } - Login(String n, String uname, String pass) { - name = n; - username = uname; - password = pass; - } + // 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); } - Login logArr[] = new Login[20]; - int i = 0; + @Override + public void actionPerformed(ActionEvent e) { + } - public static void main(String args[]) { + // Main method to run the application + public static void main(String[] args) { + // Loading screen class + new SplashScreen(); try { - for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { - if ("Darcula".equals(info.getName())) { - javax.swing.UIManager.setLookAndFeel(info.getClassName()); - break; - } - } - } catch (ClassNotFoundException ex) { - java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (InstantiationException ex) { - java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (IllegalAccessException ex) { - java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (javax.swing.UnsupportedLookAndFeelException ex) { - java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + new PasswordManager(); + } catch (Exception ex) { + ex.printStackTrace(); } - - java.awt.EventQueue.invokeLater(new Runnable() { - public void run() { - new NewJFrame().setVisible(true); - } - }); } - - private javax.swing.JButton jButton1; - private javax.swing.JButton jButton2; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel4; - private javax.swing.JLabel jLabel5; - private javax.swing.JLabel jLabel6; - private javax.swing.JLabel jLabel7; - private javax.swing.JLabel jLabel8; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel2; - private javax.swing.JPanel jPanel3; - private javax.swing.JScrollPane jScrollPane1; - private javax.swing.JSeparator jSeparator1; - private javax.swing.JTabbedPane jTabbedPane1; - private javax.swing.JTable jTable1; - private javax.swing.JTextField jTextField1; - private javax.swing.JTextField jTextField2; - private javax.swing.JTextField jTextField3; - private javax.swing.JTextField jTextField4; } From 6ebc838125861266ef131ccc09dd96df921c3a44 Mon Sep 17 00:00:00 2001 From: Jatin <75193966+oyejateen@users.noreply.github.com> Date: Sat, 24 Feb 2024 23:14:20 -0800 Subject: [PATCH 5/6] Update PasswordManager.java --- PasswordManager/PasswordManager.java | 706 ++++++++++++++++++++++----- 1 file changed, 576 insertions(+), 130 deletions(-) diff --git a/PasswordManager/PasswordManager.java b/PasswordManager/PasswordManager.java index 4615748..9c8933d 100644 --- a/PasswordManager/PasswordManager.java +++ b/PasswordManager/PasswordManager.java @@ -6,20 +6,27 @@ 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() { + 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(); @@ -27,30 +34,31 @@ class SplashScreen { runningPBar(); } - public void createGUI() { - frame = new JFrame(); // to create a frame + 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.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 + 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); + + 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 + + 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); @@ -58,195 +66,633 @@ public void addProgressBar() { 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 + 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) + if(i==100) frame.dispose(); - } catch (Exception e) { + }catch(Exception e){ e.printStackTrace(); } } } } -class PasswordStrengthChecker { - public boolean isStrong(String password) { - // Implement your password strength checking logic here - // For example, you can check the length, presence of uppercase, lowercase, - // digits, and special characters - // For simplicity, let's consider a password strong if it has at least 8 characters - return password.length() >= 8; - } -} - -interface hashTableMap { - Object get_Acc(Object Account); - - int add_Acc(Object Account, Object passwd); - - Object remove_Acc(Object Account); -} - +//Linear Probing Implementation class HashtablePassword implements hashTableMap { - 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 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 { + private static class Entry{ Object key, value; - - Entry(Object k, Object v) { - key = k; - value = v; + Entry(Object k, Object v){ + key = k; value = v; } } - - public HashtablePassword(int capacity, float loadFactor) { + 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; + } } - // Complementary functions @Override public int add_Acc(Object Account, Object passwd) { - // Your implementation to add account and password to the hash table - return 0; // Dummy return value + 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) { - // Your implementation to get password from the hash table - return null; // Dummy return value + 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) { - // Your implementation to remove account and password from the hash table - return null; // Dummy return value + 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 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, 400); + frame.setSize(400,650); frame.setResizable(false); ImageIcon img = new ImageIcon("background.png"); - background = new JLabel("", img, JLabel.CENTER); - background.setBounds(0, 0, 400, 400); + 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); - // Store password button settings + //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, 90, 220, 40); + PassStoreBtn.setBounds(90, 230, 220, 40); conn1.add(PassStoreBtn); GUIButtonsSetting(PassStoreBtn); - // Store password action + //Store password action PassStoreBtn.addActionListener(e -> { - if (PassStoreBtn == e.getSource()) { - try { - // Implement storing password logic here - } catch (Exception ex) { - JOptionPane.showMessageDialog(conn1, "Error storing password", "Error", JOptionPane.ERROR_MESSAGE); + 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);} } - }); + } + ); - // Search password button settings + //searching password PassSearchBtn = new JButton("SEARCH PASSWORD"); - PassSearchBtn.setBounds(90, 160, 220, 40); - conn1.add(PassSearchBtn); GUIButtonsSetting(PassSearchBtn); - // Search password action - PassSearchBtn.addActionListener(e -> { - if (PassSearchBtn == e.getSource()) { - try { - // Implement searching password logic here - } catch (Exception ex) { - JOptionPane.showMessageDialog(conn1, "Error searching password", "Error", JOptionPane.ERROR_MESSAGE); + 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); + } } } - }); + ); - // Delete password button settings + // deleting password PassDeleteBtn = new JButton("DELETE PASSWORD"); - PassDeleteBtn.setBounds(90, 230, 220, 40); - conn1.add(PassDeleteBtn); GUIButtonsSetting(PassDeleteBtn); - // Delete password action + PassDeleteBtn.setBounds(90, 370, 220, 40); + conn1.add(PassDeleteBtn); PassDeleteBtn.addActionListener(e -> { if (PassDeleteBtn == e.getSource()) { try { - // Implement deleting password logic here + 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, "Error deleting password", "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(conn1, "Write something", "EXIT", JOptionPane.ERROR_MESSAGE); } } - }); - } - - // 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); - } + } + ); + + 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); + } + } + } + ); - // 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); } - @Override - public void actionPerformed(ActionEvent e) { + // 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 + // main method to run the application public static void main(String[] args) { - // Loading screen class + //loading screen class new SplashScreen(); try { new PasswordManager(); - } catch (Exception ex) { - ex.printStackTrace(); - } - } + }catch (Exception ex) { ex.printStackTrace(); } + } } From 194514dea728cf017debbe553cf64219634ab779 Mon Sep 17 00:00:00 2001 From: ashutoshpaliwal26 <112794799+ashutoshpaliwal26@users.noreply.github.com> Date: Sun, 25 Feb 2024 13:25:50 +0530 Subject: [PATCH 6/6] Update readme.md --- PasswordManager/readme.md | 72 ++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/PasswordManager/readme.md b/PasswordManager/readme.md index df28ab9..318dc02 100644 --- a/PasswordManager/readme.md +++ b/PasswordManager/readme.md @@ -1,16 +1,72 @@ # 📝 Password Manager Application -This is a simple password manager application developed in Java using Swing GUI. +## 🚀 Introduction -## 🚀 Features +The Password Manager is a powerful yet simple Java application designed to help users securely store and manage their passwords. It provides basic password management functionality, including storing, searching, and deleting passwords, as well as adding and retrieving notes. -- Add, view, and remove login credentials. -- User-friendly interface. -- Dark theme using the Darcula look and feel. +## ✨ Features -## 🖥️ Screenshots +- **Password Storage:** Users can store their account names and passwords securely using a Hashtable implementation. +- **Password Generator:** The application includes a password generator for creating strong and secure passwords. +- **Security Questions:** Users can set security questions and answers for added account security. + +## 🛠️ Getting Started + +### Prerequisites + +- Java Development Kit (JDK) installed on your machine. +- A basic understanding of Java programming. + +### 📥 Installation + +1. Clone the repository to your local machine: + + ```bash + git clone + ``` + +2. Compile the Java files: + + ```bash + javac PasswordManager.java + ``` + +3. Run the application: + + ```bash + java PasswordManager + ``` + +## 🎮 Usage + +### Storing Passwords + +1. Launch the Password Manager application. +2. Click on the "STORE PASSWORD" button. +3. Enter the account name and password. +4. Set a security question and answer. +5. Click the "STORE" button. + +### Searching Passwords + +1. Click on the "SEARCH PASSWORD" button. +2. Enter the account name for which you want to retrieve the password. +3. Answer the security question. +4. View the retrieved password. + +### Deleting Passwords + +1. Click on the "DELETE PASSWORD" button. +2. Enter the account name you want to delete. +3. Confirm the deletion. + + +## 🔒 Security Considerations + +- This password manager does not implement encryption for simplicity. In a real-world scenario, encryption should be added to enhance security. +- Users should set strong passwords and security questions for better protection. +- Ensure that the machine running the application is secure to prevent unauthorized access. -Include screenshots here if applicable. ## 🛠️ Installation @@ -97,5 +153,3 @@ We welcome contributions from the community! If you'd like to contribute to the git push origin feature/your-feature-name ``` 7. **Submit a pull request**: Go to the original repository on GitHub and click the "New pull request" button. Describe your changes in detail and submit your pull request. - -