|
|
|
def hash_passkey(passkey): |
|
return hashlib.sha256(passkey.encode()).hexdigest() |
|
|
|
def generate_key_from_passkey(passkey): |
|
hashed = hashlib.sha256(passkey.encode()).digest() |
|
return base64.urlsafe_b64encode(hashed[:32]) |
|
|
|
def encrypt_data(text, passkey): |
|
key = generate_key_from_passkey(passkey) |
|
cipher = Fernet(key) |
|
return cipher.encrypt(text.encode()).decode() |
|
|
|
def decrypt_data(encrypted_text, passkey, data_id): |
|
try: |
|
hashed_passkey = hash_passkey(passkey) |
|
if ( |
|
data_id in streamlit.session_state.stored_data and |
|
streamlit.session_state.stored_data[data_id]["passkey"] == hashed_passkey |
|
): |
|
key = generate_key_from_passkey(passkey) |
|
cipher = Fernet(key) |
|
decrypted = cipher.decrypt(encrypted_text.encode()).decode() |
|
streamlit.session_state.failed_attempts = 0 |
|
return decrypted |
|
else: |
|
streamlit.session_state.failed_attempts += 1 |
|
streamlit.session_state.last_attempt_time = time.time() |
|
return None |
|
except Exception: |
|
streamlit.session_state.failed_attempts += 1 |
|
streamlit.session_state.last_attempt_time = time.time() |
|
return None |
|
|
|
def reset_failed_attempts(): |
|
streamlit.session_state.failed_attempts = 0 |
|
|
|
def change_page(page): |
|
streamlit.session_state.current_page = page |
|
|
|
|
|
|
|
def main(): |
|
|
|
if "failed_attempts" not in streamlit.session_state: |
|
streamlit.session_state.failed_attempts = 0 |
|
if "stored_data" not in streamlit.session_state: |
|
streamlit.session_state.stored_data = {} |
|
if "current_page" not in streamlit.session_state: |
|
streamlit.session_state.current_page = "Home" |
|
if "last_attempt_time" not in streamlit.session_state: |
|
streamlit.session_state.last_attempt_time = 0 |
|
|
|
streamlit.title("π Secure Data Encryption System") |
|
|
|
|
|
menu = ["Home", "Store Data", "Retrieve Data", "Login"] |
|
choice = streamlit.sidebar.selectbox("Navigation", menu, index=menu.index(streamlit.session_state.current_page)) |
|
streamlit.session_state.current_page = choice |
|
|
|
|
|
if streamlit.session_state.failed_attempts >= 3: |
|
streamlit.session_state.current_page = "Login" |
|
streamlit.warning("π Too many failed attempts! Reauthorization required.") |
|
|
|
|
|
|
|
|
|
if streamlit.session_state.current_page == "Home": |
|
streamlit.subheader("π Welcome to the Secure Data System") |
|
streamlit.write("Use this app to **securely store and retrieve data** using unique passkeys.") |
|
|
|
col1, col2 = streamlit.columns(2) |
|
with col1: |
|
if streamlit.button("Store New Data", use_container_width=True): |
|
change_page("Store Data") |
|
with col2: |
|
if streamlit.button("Retrieve Data", use_container_width=True): |
|
change_page("Retrieve Data") |
|
|
|
streamlit.info(f"Currently storing {len(streamlit.session_state.stored_data)} encrypted data entries.") |
|
|
|
|
|
elif streamlit.session_state.current_page == "Store Data": |
|
streamlit.subheader("π Store Data Securely") |
|
user_data = streamlit.text_area("Enter Data:") |
|
passkey = streamlit.text_input("Enter Passkey:", type="password") |
|
confirm_passkey = streamlit.text_input("Confirm Passkey:", type="password") |
|
|
|
if streamlit.button("Encrypt & Save"): |
|
if user_data and passkey and confirm_passkey: |
|
if passkey != confirm_passkey: |
|
streamlit.error("β οΈ Passkeys do not match!") |
|
else: |
|
data_id = str(uuid.uuid4()) |
|
hashed_passkey = hash_passkey(passkey) |
|
encrypted_text = encrypt_data(user_data, passkey) |
|
|
|
streamlit.session_state.stored_data[data_id] = { |
|
"encrypted_text": encrypted_text, |
|
"passkey": hashed_passkey |
|
} |
|
|
|
streamlit.success("β
Data stored securely!") |
|
streamlit.code(data_id, language="text") |
|
streamlit.info("β οΈ Save this Data ID! You'll need it to retrieve your data.") |
|
else: |
|
streamlit.error("β οΈ All fields are required!") |
|
|
|
|
|
elif streamlit.session_state.current_page == "Retrieve Data": |
|
streamlit.subheader("π Retrieve Your Data") |
|
attempts_remaining = 3 - streamlit.session_state.failed_attempts |
|
streamlit.info(f"Attempts remaining: {attempts_remaining}") |
|
|
|
data_id = streamlit.text_input("Enter Data ID:") |
|
passkey = streamlit.text_input("Enter Passkey:", type="password") |
|
|
|
if streamlit.button("Decrypt"): |
|
if data_id and passkey: |
|
if data_id in streamlit.session_state.stored_data: |
|
encrypted_text = streamlit.session_state.stored_data[data_id]["encrypted_text"] |
|
decrypted_text = decrypt_data(encrypted_text, passkey, data_id) |
|
|
|
if decrypted_text: |
|
streamlit.success("β
Decryption successful!") |
|
streamlit.markdown("### Your Decrypted Data:") |
|
streamlit.code(decrypted_text, language="text") |
|
else: |
|
streamlit.error(f"β Incorrect passkey! Attempts remaining: {3 - streamlit.session_state.failed_attempts}") |
|
else: |
|
streamlit.error("β Data ID not found!") |
|
|
|
if streamlit.session_state.failed_attempts >= 3: |
|
streamlit.warning("π Too many failed attempts! Redirecting to Login Page.") |
|
streamlit.session_state.current_page = "Login" |
|
streamlit.rerun() |
|
else: |
|
streamlit.error("β οΈ Both fields are required!") |
|
|
|
|
|
elif streamlit.session_state.current_page == "Login": |
|
streamlit.subheader("π Reauthorization Required") |
|
|
|
if time.time() - streamlit.session_state.last_attempt_time < 10 and streamlit.session_state.failed_attempts >= 3: |
|
remaining_time = int(10 - (time.time() - streamlit.session_state.last_attempt_time)) |
|
streamlit.warning(f"π Please wait {remaining_time} seconds before trying again.") |
|
else: |
|
login_pass = streamlit.text_input("Enter Master Password:", type="password") |
|
|
|
if streamlit.button("Login"): |
|
if login_pass == "admin123": |
|
reset_failed_attempts() |
|
streamlit.success("β
Reauthorized successfully!") |
|
streamlit.session_state.current_page = "Home" |
|
streamlit.rerun() |
|
else: |
|
streamlit.error("β Incorrect password!") |
|
|
|
|
|
streamlit.markdown("---") |
|
streamlit.markdown("π Secure Data Encryption System | Educational Project") |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
main() |
|
|