Sharokey Python SDK for secure secret sharing with Zero Knowledge encryption
Project description
🐍 Sharokey Python SDK
Zero Knowledge secret sharing - API cohérente avec les commandes CLI
🚀 Installation
pip install sharokey
⚡ Démarrage rapide
import asyncio
import sharokey
async def main():
# Configuration (équivalent: sharokey config --token xxx)
client = sharokey.SharokeyClient(token="votre-token")
# Créer un secret (équivalent: sharokey create "secret" --hours 24 --views 1)
secret = await client.create("Mon secret confidentiel", 24, 1)
print(f"URL de partage: {secret.share_url}")
# Lister les secrets (équivalent: sharokey list)
secrets = await client.list()
print(f"Total: {secrets.count} secrets")
asyncio.run(main())
📚 API - Cohérente avec CLI
Configuration
import sharokey
# Configuration de base
client = sharokey.SharokeyClient(
token="votre-token-api", # REQUIS
api_url="https://...", # Optionnel (défaut: production)
timeout=30 # Optionnel (défaut: 30s)
)
Créer un secret
# Secret simple (équivalent: sharokey create "message" --hours 24 --views 1)
secret = await client.create("Mon mot de passe secret", 24, 1)
print(f"URL: {secret.share_url}")
print(f"Expire le: {secret.expiration}")
# Avec toutes les options (équivalent: sharokey create --description ... --otp-email ...)
secret = await client.create(
"Informations critiques",
hours=2,
views=3,
description="Accès serveur production",
message="À utiliser dans les 2 heures",
password="protection-additionnelle",
otp_email="admin@entreprise.com" # OTP par email
)
# Avec OTP SMS
secret = await client.create(
"Code d'accès",
hours=1,
views=1,
otp_phone="+33674747474" # OTP par SMS
)
# Avec pièces jointes (équivalent: sharokey create --attach fichier1 --attach fichier2)
secret = await client.create(
"Documents confidentiels",
hours=48,
views=5,
description="Contrat et annexes",
attachments=["contrat.pdf", "conditions.docx"], # Chemins vers fichiers
password="protection2024"
)
Lister les secrets
# Lister tous (équivalent: sharokey list)
secrets = await client.list()
print(f"{secrets.count} secrets trouvés")
# Avec filtres (équivalent: sharokey list --status active --limit 10)
secrets = await client.list(
status='active',
limit=10,
creator='admin@example.com',
search='serveur'
)
# Parcourir les résultats
for secret in secrets.data:
vues_restantes = secret.maximum_views - secret.current_views
print(f"{secret.slug}: {secret.description} ({vues_restantes} vues restantes)")
Détails d'un secret
# Obtenir les détails (équivalent: sharokey get ABC123)
secret = await client.get("ABC123XYZ")
print(f"Description: {secret.description}")
print(f"Créateur: {secret.creator}")
print(f"Vues: {secret.current_views}/{secret.maximum_views}")
print(f"Expire le: {secret.expiration}")
print(f"Pièces jointes: {secret.has_attachments}")
Supprimer un secret
# Supprimer (équivalent: sharokey delete ABC123)
success = await client.delete("ABC123XYZ")
if success:
print("Secret supprimé avec succès")
Statistiques
# Obtenir les stats (équivalent: sharokey stats)
stats = await client.stats()
print(f"Total secrets: {stats.total_secrets}")
print(f"Secrets actifs: {stats.active_secrets}")
print(f"Secrets expirés: {stats.expired_secrets}")
print(f"Total vues: {stats.total_views}")
🔧 Fonctions utilitaires
Tester la connectivité
# Tester la connexion API
connected = await client.test_connection()
if not connected:
print("Impossible de se connecter à Sharokey")
💡 Exemples pratiques
Script d'automatisation
#!/usr/bin/env python3
import asyncio
import sharokey
from pathlib import Path
async def deploy_credentials():
"""Déployer des identifiants de manière sécurisée."""
client = sharokey.SharokeyClient(token="votre-token")
# Créer un secret pour les identifiants de déploiement
secret = await client.create(
"DB_PASSWORD=super_secret_pwd",
hours=1, # Expire dans 1 heure
views=1, # Une seule vue
description="Identifiants base de données - déploiement",
otp_email="devops@entreprise.com"
)
print(f"🔐 Identifiants créés: {secret.share_url}")
return secret.share_url
# Utilisation
if __name__ == "__main__":
url = asyncio.run(deploy_credentials())
print(f"Envoyez cette URL à l'équipe: {url}")
Partage de fichiers sécurisé
import asyncio
import sharokey
from pathlib import Path
async def share_files():
"""Partager des fichiers de manière sécurisée."""
client = sharokey.SharokeyClient(token="votre-token")
# Fichiers à partager
files = [
"documents/contrat.pdf",
"documents/specifications.docx",
"documents/budget.xlsx"
]
# Créer le secret avec attachments
secret = await client.create(
"Dossier client ABC - documents contractuels",
hours=72, # 3 jours
views=10, # 10 consultations max
description="Documents contrat client ABC Corp",
attachments=files,
password="ContratABC2024",
otp_email="commercial@entreprise.com"
)
print(f"📎 Dossier partagé: {secret.share_url}")
print(f"📄 {len(files)} fichiers joints")
print(f"🔒 Protégé par mot de passe et OTP email")
return secret
# Utilisation
asyncio.run(share_files())
Dashboard de monitoring
import asyncio
import sharokey
async def dashboard():
"""Dashboard simple des secrets."""
client = sharokey.SharokeyClient(token="votre-token")
# Obtenir les statistiques
stats = await client.stats()
print("📊 DASHBOARD SHAROKEY")
print("=" * 40)
print(f"Total secrets: {stats.total_secrets:>8}")
print(f"Secrets actifs: {stats.active_secrets:>8}")
print(f"Secrets expirés: {stats.expired_secrets:>8}")
print(f"Total vues: {stats.total_views:>8}")
print()
# Lister les secrets récents
recent = await client.list(limit=5)
print("🔐 SECRETS RÉCENTS")
print("=" * 40)
for secret in recent.data:
status = "🟢 Actif" if secret.current_views < secret.maximum_views else "🔴 Épuisé"
print(f"{secret.slug} | {status} | {secret.description or 'Sans description'}")
print(f"\n⏱️ Mis à jour à: {asyncio.get_event_loop().time()}")
# Lancer le dashboard
asyncio.run(dashboard())
🚨 Gestion d'erreurs
Erreurs courantes
import sharokey
async def handle_errors():
client = sharokey.SharokeyClient(token="votre-token")
try:
# Tentative de création avec paramètres invalides
await client.create("", -1, 0)
except sharokey.ValidationError as e:
print(f"❌ Erreur de validation: {e}")
# Exemple: "Content is required and must be non-empty"
except sharokey.AuthenticationError as e:
print(f"❌ Erreur d'authentification: {e}")
# Token invalide ou expiré
except sharokey.NotFoundError as e:
print(f"❌ Secret non trouvé: {e}")
# Secret n'existe pas ou a expiré
except sharokey.AttachmentError as e:
print(f"❌ Erreur fichier: {e}")
# Fichier trop gros, introuvable, etc.
except sharokey.NetworkError as e:
print(f"❌ Erreur réseau: {e}")
# Timeout, rate limiting, etc.
except sharokey.SharokeyError as e:
print(f"❌ Erreur générale: {e}")
# Toutes autres erreurs API
Validation locale
# Le SDK valide automatiquement :
# - Contenu non vide
# - Heures entre 1 et 8760
# - Vues entre 1 et 1000
# - Token configuré
# - Attachments : max 10 fichiers, 10MB total
# - OTP : email et phone mutuellement exclusifs
try:
await client.create("", -1, 0) # Plusieurs erreurs
except sharokey.ValidationError as e:
print(e) # "Content is required and must be non-empty"
# Erreur attachments
try:
files = ["huge_file.zip"] # > 10MB
await client.create("test", 24, 1, attachments=files)
except sharokey.AttachmentError as e:
print(e) # "Total attachments size too large: 25.3MB. Maximum 10MB allowed"
🔐 Sécurité
Chiffrement Zero Knowledge
- Algorithmes : AES-GCM-256 + PBKDF2 (10,000 itérations)
- Chiffrement côté client : Vos secrets ne quittent jamais votre machine en clair
- Double clé : keyA (serveur) + keyB (fragment URL)
- Compatibilité totale : Secrets créés par Python déchiffrables partout (CLI, web, etc.)
Bonnes pratiques
# ✅ Recommandé
secret = await client.create(
"mot-de-passe-super-secret",
hours=1, # Courte durée
views=1, # Une seule vue
password="protection-additionnelle",
otp_email="admin@secure.com"
)
# ❌ À éviter
secret = await client.create(
"mot-de-passe-super-secret",
hours=8760, # 1 an = trop long
views=1000 # Trop de vues possibles
)
🆚 Comparaison avec CLI
| Fonctionnalité | CLI C# | Python SDK |
|---|---|---|
| Configuration | sharokey config --token xxx |
SharokeyClient(token='xxx') |
| Création | sharokey create "secret" --hours 24 |
client.create("secret", 24, 1) |
| Liste | sharokey list --limit 10 |
client.list(limit=10) |
| Détails | sharokey get ABC123 |
client.get('ABC123') |
| Suppression | sharokey delete ABC123 |
client.delete('ABC123') |
| Stats | sharokey stats |
client.stats() |
| Pièces jointes | --attach file1 --attach file2 |
attachments=['file1', 'file2'] |
| OTP Email | --otp-email user@domain.com |
otp_email='user@domain.com' |
| OTP SMS | --otp-phone +33123456789 |
otp_phone='+33123456789' |
| Chiffrement | ✅ Zero Knowledge | ✅ Identique |
📦 Installation développement
# Cloner le repo
git clone https://github.com/sharokey/python-sdk.git
cd python-sdk
# Installer en mode développement
pip install -e .[dev]
# Lancer les tests
pytest
# Linting
black sharokey/
isort sharokey/
mypy sharokey/
🐛 Support
- Issues GitHub : https://github.com/sharokey/python-sdk/issues
- Documentation : https://docs.sharokey.com/python
- Examples : examples/
⚡ Prêt à l'usage !
Votre SDK Python Sharokey est prêt !
- ✅ Installez :
pip install sharokey - ✅ Configurez :
client = SharokeyClient(token='...') - ✅ Utilisez : API cohérente avec le CLI !
Python SDK 1.0.0 - Compatible avec Sharokey API
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
sharokey-1.0.0.tar.gz
(27.4 kB
view details)
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
sharokey-1.0.0-py3-none-any.whl
(18.9 kB
view details)