muhammadshaheryar commited on
Commit
d1b5b2c
Β·
verified Β·
1 Parent(s): b0b5d9b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +83 -105
app.py CHANGED
@@ -1,12 +1,12 @@
1
  # Initialize session state variables if they don't exist
2
- if 'failed_attempts' not in st.session_state:
3
- st.session_state.failed_attempts = 0
4
- if 'stored_data' not in st.session_state:
5
- st.session_state.stored_data = {}
6
- if 'current_page' not in st.session_state:
7
- st.session_state.current_page = "Home"
8
- if 'last_attempt_time' not in st.session_state:
9
- st.session_state.last_attempt_time = 0
10
 
11
  # Function to hash passkey
12
  def hash_passkey(passkey):
@@ -14,9 +14,7 @@ def hash_passkey(passkey):
14
 
15
  # Function to generate a key from passkey (for encryption)
16
  def generate_key_from_passkey(passkey):
17
- # Use the passkey to create a consistent key
18
  hashed = hashlib.sha256(passkey.encode()).digest()
19
- # Ensure it's valid for Fernet (32 url-safe base64-encoded bytes)
20
  return base64.urlsafe_b64encode(hashed[:32])
21
 
22
  # Function to encrypt data
@@ -28,24 +26,20 @@ def encrypt_data(text, passkey):
28
  # Function to decrypt data
29
  def decrypt_data(encrypted_text, passkey, data_id):
30
  try:
31
- # Check if the passkey matches
32
  hashed_passkey = hash_passkey(passkey)
33
- if data_id in st.session_state.stored_data and st.session_state.stored_data[data_id]["passkey"] == hashed_passkey:
34
- # If passkey matches, decrypt the data
35
  key = generate_key_from_passkey(passkey)
36
  cipher = Fernet(key)
37
  decrypted = cipher.decrypt(encrypted_text.encode()).decode()
38
- st.session_state.failed_attempts = 0
39
  return decrypted
40
  else:
41
- # Increment failed attempts
42
- st.session_state.failed_attempts += 1
43
- st.session_state.last_attempt_time = time.time()
44
  return None
45
  except Exception as e:
46
- # If decryption fails, increment failed attempts
47
- st.session_state.failed_attempts += 1
48
- st.session_state.last_attempt_time = time.time()
49
  return None
50
 
51
  # Function to generate a unique ID for data
@@ -55,130 +49,114 @@ def generate_data_id():
55
 
56
  # Function to reset failed attempts
57
  def reset_failed_attempts():
58
- st.session_state.failed_attempts = 0
59
 
60
  # Function to change page
61
  def change_page(page):
62
- st.session_state.current_page = page
63
 
64
  # Streamlit UI
65
- st.title("πŸ”’ Secure Data Encryption System")
66
 
67
  # Navigation
68
  menu = ["Home", "Store Data", "Retrieve Data", "Login"]
69
- choice = st.sidebar.selectbox("Navigation", menu, index=menu.index(st.session_state.current_page))
70
 
71
  # Update current page based on selection
72
- st.session_state.current_page = choice
73
 
74
  # Check if too many failed attempts
75
- if st.session_state.failed_attempts >= 3:
76
- # Force redirect to login page
77
- st.session_state.current_page = "Login"
78
- st.warning("πŸ”’ Too many failed attempts! Reauthorization required.")
79
 
80
  # Display current page
81
- if st.session_state.current_page == "Home":
82
- st.subheader("🏠 Welcome to the Secure Data System")
83
- st.write("Use this app to **securely store and retrieve data** using unique passkeys.")
84
-
85
- col1, col2 = st.columns(2)
86
  with col1:
87
- if st.button("Store New Data", use_container_width=True):
88
  change_page("Store Data")
89
  with col2:
90
- if st.button("Retrieve Data", use_container_width=True):
91
  change_page("Retrieve Data")
92
-
93
- # Display stored data count
94
- st.info(f"Currently storing {len(st.session_state.stored_data)} encrypted data entries.")
95
 
96
- elif st.session_state.current_page == "Store Data":
97
- st.subheader("πŸ“‚ Store Data Securely")
98
- user_data = st.text_area("Enter Data:")
99
- passkey = st.text_input("Enter Passkey:", type="password")
100
- confirm_passkey = st.text_input("Confirm Passkey:", type="password")
 
 
101
 
102
- if st.button("Encrypt & Save"):
103
  if user_data and passkey and confirm_passkey:
104
  if passkey != confirm_passkey:
105
- st.error("⚠️ Passkeys do not match!")
106
  else:
107
- # Generate a unique ID for this data
108
  data_id = generate_data_id()
109
-
110
- # Hash the passkey
111
  hashed_passkey = hash_passkey(passkey)
112
-
113
- # Encrypt the data
114
  encrypted_text = encrypt_data(user_data, passkey)
115
-
116
- # Store in the required format
117
- st.session_state.stored_data[data_id] = {
118
  "encrypted_text": encrypted_text,
119
  "passkey": hashed_passkey
120
  }
121
-
122
- st.success("βœ… Data stored securely!")
123
-
124
- # Display the data ID for retrieval
125
- st.code(data_id, language="text")
126
- st.info("⚠️ Save this Data ID! You'll need it to retrieve your data.")
127
  else:
128
- st.error("⚠️ All fields are required!")
129
-
130
- elif st.session_state.current_page == "Retrieve Data":
131
- st.subheader("πŸ” Retrieve Your Data")
132
-
133
- # Show attempts remaining
134
- attempts_remaining = 3 - st.session_state.failed_attempts
135
- st.info(f"Attempts remaining: {attempts_remaining}")
136
-
137
- data_id = st.text_input("Enter Data ID:")
138
- passkey = st.text_input("Enter Passkey:", type="password")
139
-
140
- if st.button("Decrypt"):
141
  if data_id and passkey:
142
- if data_id in st.session_state.stored_data:
143
- encrypted_text = st.session_state.stored_data[data_id]["encrypted_text"]
144
  decrypted_text = decrypt_data(encrypted_text, passkey, data_id)
145
 
146
  if decrypted_text:
147
- st.success("βœ… Decryption successful!")
148
- st.markdown("### Your Decrypted Data:")
149
- st.code(decrypted_text, language="text")
150
  else:
151
- st.error(f"❌ Incorrect passkey! Attempts remaining: {3 - st.session_state.failed_attempts}")
152
  else:
153
- st.error("❌ Data ID not found!")
154
-
155
- # Check if too many failed attempts after this attempt
156
- if st.session_state.failed_attempts >= 3:
157
- st.warning("πŸ”’ Too many failed attempts! Redirecting to Login Page.")
158
- st.session_state.current_page = "Login"
159
- st.rerun() # Updated from experimental_rerun()
160
  else:
161
- st.error("⚠️ Both fields are required!")
162
-
163
- elif st.session_state.current_page == "Login":
164
- st.subheader("πŸ”‘ Reauthorization Required")
165
-
166
- # Add a simple timeout mechanism
167
- if time.time() - st.session_state.last_attempt_time < 10 and st.session_state.failed_attempts >= 3:
168
- remaining_time = int(10 - (time.time() - st.session_state.last_attempt_time))
169
- st.warning(f"πŸ•’ Please wait {remaining_time} seconds before trying again.")
170
  else:
171
- login_pass = st.text_input("Enter Master Password:", type="password")
172
 
173
- if st.button("Login"):
174
- if login_pass == "admin123": # Hardcoded for demo, replace with proper auth
175
  reset_failed_attempts()
176
- st.success("βœ… Reauthorized successfully!")
177
- st.session_state.current_page = "Home"
178
- st.rerun() # Updated from experimental_rerun()
179
  else:
180
- st.error("❌ Incorrect password!")
181
 
182
- # Add a footer
183
- st.markdown("---")
184
- st.markdown("πŸ” Secure Data Encryption System | Educational Project")
 
1
  # Initialize session state variables if they don't exist
2
+ if 'failed_attempts' not in streamlit.session_state:
3
+ streamlit.session_state.failed_attempts = 0
4
+ if 'stored_data' not in streamlit.session_state:
5
+ streamlit.session_state.stored_data = {}
6
+ if 'current_page' not in streamlit.session_state:
7
+ streamlit.session_state.current_page = "Home"
8
+ if 'last_attempt_time' not in streamlit.session_state:
9
+ streamlit.session_state.last_attempt_time = 0
10
 
11
  # Function to hash passkey
12
  def hash_passkey(passkey):
 
14
 
15
  # Function to generate a key from passkey (for encryption)
16
  def generate_key_from_passkey(passkey):
 
17
  hashed = hashlib.sha256(passkey.encode()).digest()
 
18
  return base64.urlsafe_b64encode(hashed[:32])
19
 
20
  # Function to encrypt data
 
26
  # Function to decrypt data
27
  def decrypt_data(encrypted_text, passkey, data_id):
28
  try:
 
29
  hashed_passkey = hash_passkey(passkey)
30
+ if data_id in streamlit.session_state.stored_data and streamlit.session_state.stored_data[data_id]["passkey"] == hashed_passkey:
 
31
  key = generate_key_from_passkey(passkey)
32
  cipher = Fernet(key)
33
  decrypted = cipher.decrypt(encrypted_text.encode()).decode()
34
+ streamlit.session_state.failed_attempts = 0
35
  return decrypted
36
  else:
37
+ streamlit.session_state.failed_attempts += 1
38
+ streamlit.session_state.last_attempt_time = time.time()
 
39
  return None
40
  except Exception as e:
41
+ streamlit.session_state.failed_attempts += 1
42
+ streamlit.session_state.last_attempt_time = time.time()
 
43
  return None
44
 
45
  # Function to generate a unique ID for data
 
49
 
50
  # Function to reset failed attempts
51
  def reset_failed_attempts():
52
+ streamlit.session_state.failed_attempts = 0
53
 
54
  # Function to change page
55
  def change_page(page):
56
+ streamlit.session_state.current_page = page
57
 
58
  # Streamlit UI
59
+ streamlit.title("πŸ”’ Secure Data Encryption System")
60
 
61
  # Navigation
62
  menu = ["Home", "Store Data", "Retrieve Data", "Login"]
63
+ choice = streamlit.sidebar.selectbox("Navigation", menu, index=menu.index(streamlit.session_state.current_page))
64
 
65
  # Update current page based on selection
66
+ streamlit.session_state.current_page = choice
67
 
68
  # Check if too many failed attempts
69
+ if streamlit.session_state.failed_attempts >= 3:
70
+ streamlit.session_state.current_page = "Login"
71
+ streamlit.warning("πŸ”’ Too many failed attempts! Reauthorization required.")
 
72
 
73
  # Display current page
74
+ if streamlit.session_state.current_page == "Home":
75
+ streamlit.subheader("🏠 Welcome to the Secure Data System")
76
+ streamlit.write("Use this app to **securely store and retrieve data** using unique passkeys.")
77
+
78
+ col1, col2 = streamlit.columns(2)
79
  with col1:
80
+ if streamlit.button("Store New Data", use_container_width=True):
81
  change_page("Store Data")
82
  with col2:
83
+ if streamlit.button("Retrieve Data", use_container_width=True):
84
  change_page("Retrieve Data")
 
 
 
85
 
86
+ streamlit.info(f"Currently storing {len(streamlit.session_state.stored_data)} encrypted data entries.")
87
+
88
+ elif streamlit.session_state.current_page == "Store Data":
89
+ streamlit.subheader("πŸ“‚ Store Data Securely")
90
+ user_data = streamlit.text_area("Enter Data:")
91
+ passkey = streamlit.text_input("Enter Passkey:", type="password")
92
+ confirm_passkey = streamlit.text_input("Confirm Passkey:", type="password")
93
 
94
+ if streamlit.button("Encrypt & Save"):
95
  if user_data and passkey and confirm_passkey:
96
  if passkey != confirm_passkey:
97
+ streamlit.error("⚠️ Passkeys do not match!")
98
  else:
 
99
  data_id = generate_data_id()
 
 
100
  hashed_passkey = hash_passkey(passkey)
 
 
101
  encrypted_text = encrypt_data(user_data, passkey)
102
+ streamlit.session_state.stored_data[data_id] = {
 
 
103
  "encrypted_text": encrypted_text,
104
  "passkey": hashed_passkey
105
  }
106
+ streamlit.success("βœ… Data stored securely!")
107
+ streamlit.code(data_id, language="text")
108
+ streamlit.info("⚠️ Save this Data ID! You'll need it to retrieve your data.")
 
 
 
109
  else:
110
+ streamlit.error("⚠️ All fields are required!")
111
+
112
+ elif streamlit.session_state.current_page == "Retrieve Data":
113
+ streamlit.subheader("πŸ” Retrieve Your Data")
114
+
115
+ attempts_remaining = 3 - streamlit.session_state.failed_attempts
116
+ streamlit.info(f"Attempts remaining: {attempts_remaining}")
117
+
118
+ data_id = streamlit.text_input("Enter Data ID:")
119
+ passkey = streamlit.text_input("Enter Passkey:", type="password")
120
+
121
+ if streamlit.button("Decrypt"):
 
122
  if data_id and passkey:
123
+ if data_id in streamlit.session_state.stored_data:
124
+ encrypted_text = streamlit.session_state.stored_data[data_id]["encrypted_text"]
125
  decrypted_text = decrypt_data(encrypted_text, passkey, data_id)
126
 
127
  if decrypted_text:
128
+ streamlit.success("βœ… Decryption successful!")
129
+ streamlit.markdown("### Your Decrypted Data:")
130
+ streamlit.code(decrypted_text, language="text")
131
  else:
132
+ streamlit.error(f"❌ Incorrect passkey! Attempts remaining: {3 - streamlit.session_state.failed_attempts}")
133
  else:
134
+ streamlit.error("❌ Data ID not found!")
135
+
136
+ if streamlit.session_state.failed_attempts >= 3:
137
+ streamlit.warning("πŸ”’ Too many failed attempts! Redirecting to Login Page.")
138
+ streamlit.session_state.current_page = "Login"
139
+ streamlit.rerun()
 
140
  else:
141
+ streamlit.error("⚠️ Both fields are required!")
142
+
143
+ elif streamlit.session_state.current_page == "Login":
144
+ streamlit.subheader("πŸ”‘ Reauthorization Required")
145
+
146
+ if time.time() - streamlit.session_state.last_attempt_time < 10 and streamlit.session_state.failed_attempts >= 3:
147
+ remaining_time = int(10 - (time.time() - streamlit.session_state.last_attempt_time))
148
+ streamlit.warning(f"πŸ•’ Please wait {remaining_time} seconds before trying again.")
 
149
  else:
150
+ login_pass = streamlit.text_input("Enter Master Password:", type="password")
151
 
152
+ if streamlit.button("Login"):
153
+ if login_pass == "admin123":
154
  reset_failed_attempts()
155
+ streamlit.success("βœ… Reauthorized successfully!")
156
+ streamlit.session_state.current_page = "Home"
157
+ streamlit.rerun()
158
  else:
159
+ streamlit.error("❌ Incorrect password!")
160
 
161
+ streamlit.markdown("---")
162
+ streamlit.markdown("πŸ” Secure Data Encryption System | Educational Project")