{"library":"nkeys","title":"nkeys (Python)","description":"The `nkeys` Python library, currently at version 0.2.1, provides a public-key signature system built upon Ed25519 cryptography, specifically designed for identity, authentication, and authorization within the NATS ecosystem. It offers utilities for generating, encoding, and managing NATS-compatible key pairs (Operators, Accounts, Users, Servers, Clusters). The library maintains a low-to-moderate release cadence, with recent updates focusing on dependency management and Python version compatibility.","language":"python","status":"active","last_verified":"Mon May 18","install":{"commands":["pip install nkeys"],"cli":null},"imports":["import nkeys","from nacl.signing import SigningKey"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import nkeys\nfrom nacl.signing import SigningKey\nimport os\n\n# 1. Generate a raw Ed25519 signing key using PyNaCl\nraw_signing_key = SigningKey.generate()\n\n# 2. Encode the raw key as a NATS user seed (e.g., SU...)\n# The `encode_seed` function combines the raw private key with the NATS prefix.\n# Use nkeys.PREFIX_BYTE_USER for a user key, nkeys.PREFIX_BYTE_ACCOUNT for an account, etc.\nuser_seed_bytes = nkeys.encode_seed(nkeys.PREFIX_BYTE_USER, raw_signing_key.encode())\n\nprint(f\"Generated User Seed (NKEY format): {user_seed_bytes.decode()}\")\n\n# 3. Create an NKEYS KeyPair object from the seed\nkey_pair = nkeys.from_seed(user_seed_bytes)\n\nprint(f\"Public Key (U...): {key_pair.public_key.decode()}\")\n# The private key and seed should be kept secret.\n# The raw private key is a 64-byte Ed25519 private key.\nprint(f\"Private Key (raw hex - keep secret!): {key_pair.private_key.hex()}\")\nprint(f\"Seed (S... NKEY format - keep secret!): {key_pair.seed.decode()}\")\n\n# 4. Example of signing data\ndata_to_sign = b\"Hello NATS! This is a test message.\"\nsignature = key_pair.sign(data_to_sign)\nprint(f\"Signature for data: {signature.hex()}\")\n\n# 5. Verification (a KeyPair created from the public key can verify signatures)\nverifier_key_pair = nkeys.from_public_key(key_pair.public_key)\ntry:\n    verifier_key_pair.verify(data_to_sign, signature)\n    print(\"Signature verified successfully.\")\nexcept Exception as e:\n    print(f\"Signature verification failed: {e}\")\n\n# 6. Secure handling: wipe sensitive key material from memory when no longer needed\nkey_pair.wipe()\nprint(\"Sensitive key material wiped from memory for security.\")","lang":"python","description":"This quickstart demonstrates how to generate a new NATS user key pair (seed, public, and private keys) using `nkeys` and `pynacl`, then sign and verify a message. It also highlights the importance of wiping sensitive key data.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-18","installed_version":"0.2.1","pypi_latest":"0.2.1","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.5,"avg_import_s":0.02,"wheel_type":"sdist"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":1.2,"disk_size":"23.3M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3.5,"import_time_s":0.01,"mem_mb":1.2,"disk_size":"24M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.03,"mem_mb":1.4,"disk_size":"25.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3.5,"import_time_s":0.03,"mem_mb":1.4,"disk_size":"26M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.03,"mem_mb":1.1,"disk_size":"17.4M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":0.03,"mem_mb":1.1,"disk_size":"18M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":1.2,"disk_size":"17.1M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":0.02,"mem_mb":1,"disk_size":"18M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":1.2,"disk_size":"23.6M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"nkeys","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":4.2,"import_time_s":0.02,"mem_mb":1.2,"disk_size":"24M"}]}}