Pythonic OPAQUE password-authenticated key exchange
Project description
opaque-snake
Python bindings for the OPAQUE password-authenticated key exchange protocol.
OPAQUE is an asymmetric password-authenticated key exchange (aPAKE) protocol that enables secure password-based authentication without exposing plaintext credentials to the server. This library wraps the Rust opaque-ke implementation.
Quick Start
Registration
from opaque_snake import OpaqueServer, OpaqueClient
# Server setup (do this once, persist the setup)
server = OpaqueServer()
setup_bytes = server.export_setup() # Save this securely
# Client registration
client = OpaqueClient()
request, state = client.start_registration("password123")
# Server processes registration
response = server.create_registration_response(request, "user@example.com")
# Client completes registration
result = client.finish_registration(response, state, "password123")
# Client gets an export key for client-side encryption
export_key = result.export_key # 64 bytes, derived from password
# Server stores the password file
password_file = server.finish_registration(result.upload)
# Save password_file.to_bytes() in your database
Login
from opaque_snake import OpaqueServer, OpaqueClient, PasswordFile
# Restore server from saved setup
server = OpaqueServer(saved_setup_bytes)
# Client starts login
client = OpaqueClient()
request, state = client.start_login("password123")
# Server processes login (load password file from database)
password_file = PasswordFile.from_bytes(saved_password_file_bytes)
response, server_state = server.create_credential_response(
request, "user@example.com", password_file
)
# Client completes login
result = client.finish_login(response, state, "password123")
# Server verifies and gets session keys
server_keys = server.finish_login(result.finalization, server_state)
# Both parties now have matching session keys
assert result.session_keys.session_key == server_keys.session_key
# Client can also retrieve the export key (same as during registration)
export_key = result.session_keys.export_key # 64 bytes
Export Keys
Export keys are derived deterministically from the user's password and can be used for client-side encryption. The server never sees this key.
# During registration, save encrypted data using the export key
from opaque_snake import OpaqueServer, OpaqueClient
server = OpaqueServer()
client = OpaqueClient()
# Registration
req, state = client.start_registration("password123")
resp = server.create_registration_response(req, "user@example.com")
result = client.finish_registration(resp, state, "password123")
password_file = server.finish_registration(result.upload)
# Use export_key to encrypt user data client-side
export_key = result.export_key # 64 bytes
# encrypted_data = encrypt(user_secret_data, export_key)
# Store encrypted_data on server - server cannot decrypt it
# During login, recover the same export key
req, state = client.start_login("password123")
resp, server_state = server.create_credential_response(req, "user@example.com", password_file)
result = client.finish_login(resp, state, "password123")
server.finish_login(result.finalization, server_state)
# Same export key is recovered
export_key = result.session_keys.export_key
# user_secret_data = decrypt(encrypted_data, export_key)
Features
- Secure password-authenticated key exchange (RFC 9807)
- No password transmitted to server - uses OPRF
- Resistant to pre-computation attacks
- Export keys for additional key derivation
- Session keys for encrypted communication
License
MIT OR Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file opaque_snake-0.1.0.tar.gz.
File metadata
- Download URL: opaque_snake-0.1.0.tar.gz
- Upload date:
- Size: 668.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b868993593b407da99e45e9993bb9468f16abdc3fa554eefec9b7845991db2d
|
|
| MD5 |
6eaf35a95cab7edb4c2e3c89e256eaa6
|
|
| BLAKE2b-256 |
7923a445af3e7c8c8b6db23353228e2f1c44798f507349729f57ea79cee67ed5
|
File details
Details for the file opaque_snake-0.1.0-cp39-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: opaque_snake-0.1.0-cp39-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 331.7 kB
- Tags: CPython 3.9+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c69a5341cb27892a20c6ed906fe67de9543a7caa838f7ed93d336b90dd859a65
|
|
| MD5 |
b11020c2b1ab35356c677902118e9279
|
|
| BLAKE2b-256 |
affe1275f33fce86722416c124840cfdebc37d6f53828e07e5b2abc4dfbd4801
|