Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opaque_snake-0.1.0.tar.gz (668.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opaque_snake-0.1.0-cp39-abi3-macosx_11_0_arm64.whl (331.7 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

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

Hashes for opaque_snake-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6b868993593b407da99e45e9993bb9468f16abdc3fa554eefec9b7845991db2d
MD5 6eaf35a95cab7edb4c2e3c89e256eaa6
BLAKE2b-256 7923a445af3e7c8c8b6db23353228e2f1c44798f507349729f57ea79cee67ed5

See more details on using hashes here.

File details

Details for the file opaque_snake-0.1.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for opaque_snake-0.1.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c69a5341cb27892a20c6ed906fe67de9543a7caa838f7ed93d336b90dd859a65
MD5 b11020c2b1ab35356c677902118e9279
BLAKE2b-256 affe1275f33fce86722416c124840cfdebc37d6f53828e07e5b2abc4dfbd4801

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page