mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-11 09:08:31 +00:00
Add documentation for encrypted agent communication
Co-authored-by: theCyberTech <84775494+theCyberTech@users.noreply.github.com>
This commit is contained in:
249
docs/encrypted_communication.md
Normal file
249
docs/encrypted_communication.md
Normal file
@@ -0,0 +1,249 @@
|
||||
# Encrypted Agent Communication
|
||||
|
||||
CrewAI now supports encrypted agent-to-agent communication to ensure secure information exchange between agents in multi-agent workflows.
|
||||
|
||||
## Features
|
||||
|
||||
- **Fernet Encryption**: Uses industry-standard Fernet symmetric encryption
|
||||
- **Fingerprint-based Key Derivation**: Unique keys derived from agent fingerprints
|
||||
- **Secure Message Routing**: Messages can only be decrypted by intended recipients
|
||||
- **Backward Compatible**: Non-encrypted agents continue to work normally
|
||||
- **Optional**: Encryption can be enabled per-agent or per-crew
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Enable Encryption for Agents
|
||||
|
||||
```python
|
||||
from crewai import Agent
|
||||
from crewai.security import SecurityConfig
|
||||
|
||||
# Create agents with encryption enabled
|
||||
researcher = Agent(
|
||||
role="Research Analyst",
|
||||
goal="Conduct research and analysis",
|
||||
backstory="Expert researcher with deep analytical skills",
|
||||
security_config=SecurityConfig(encrypted_communication=True)
|
||||
)
|
||||
|
||||
writer = Agent(
|
||||
role="Content Writer",
|
||||
goal="Create engaging content",
|
||||
backstory="Skilled writer who creates compelling narratives",
|
||||
security_config=SecurityConfig(encrypted_communication=True)
|
||||
)
|
||||
```
|
||||
|
||||
### 2. Use Encrypted Communication in Tasks
|
||||
|
||||
```python
|
||||
from crewai import Crew, Task
|
||||
from crewai.tools.agent_tools import AskQuestionTool
|
||||
|
||||
# Create tools that support encrypted communication
|
||||
agent_tools = [
|
||||
AskQuestionTool(
|
||||
agents=[researcher, writer],
|
||||
description="Ask questions to team members with encrypted communication"
|
||||
)
|
||||
]
|
||||
|
||||
# Create tasks that will use encrypted communication
|
||||
research_task = Task(
|
||||
description="Research the latest AI trends",
|
||||
expected_output="Comprehensive research report",
|
||||
agent=researcher
|
||||
)
|
||||
|
||||
writing_task = Task(
|
||||
description="Ask the researcher about their findings and create a blog post",
|
||||
expected_output="Engaging blog post based on research",
|
||||
agent=writer,
|
||||
tools=agent_tools # These will use encrypted communication automatically
|
||||
)
|
||||
|
||||
# Run the crew - communications will be automatically encrypted
|
||||
crew = Crew(agents=[researcher, writer], tasks=[research_task, writing_task])
|
||||
result = crew.kickoff()
|
||||
```
|
||||
|
||||
## How It Works
|
||||
|
||||
### Security Architecture
|
||||
|
||||
1. **Agent Fingerprints**: Each agent gets a unique cryptographic fingerprint
|
||||
2. **Key Derivation**: Communication keys are derived from sender/recipient fingerprint pairs
|
||||
3. **Message Encryption**: Payloads are encrypted using Fernet with derived keys
|
||||
4. **Secure Routing**: Only intended recipients can decrypt messages
|
||||
|
||||
### Message Flow
|
||||
|
||||
```
|
||||
Sender Agent → Encrypt Message → Encrypted Payload → Recipient Agent → Decrypt Message
|
||||
↓ ↓ ↓ ↓ ↓
|
||||
Fingerprint Derive Key EncryptedMessage Derive Key Original Message
|
||||
```
|
||||
|
||||
### Encryption Details
|
||||
|
||||
- **Algorithm**: Fernet (AES 128 in CBC mode with HMAC-SHA256)
|
||||
- **Key Length**: 256-bit encryption keys
|
||||
- **Key Derivation**: SHA-256 based on sorted agent fingerprints
|
||||
- **Message Format**: JSON with encrypted payload and metadata
|
||||
|
||||
## Configuration Options
|
||||
|
||||
### SecurityConfig Parameters
|
||||
|
||||
```python
|
||||
from crewai.security import SecurityConfig
|
||||
|
||||
# Enable encryption
|
||||
security_config = SecurityConfig(encrypted_communication=True)
|
||||
|
||||
# Disable encryption (default)
|
||||
security_config = SecurityConfig(encrypted_communication=False)
|
||||
```
|
||||
|
||||
### Mixed Encryption Scenarios
|
||||
|
||||
```python
|
||||
# Some agents with encryption, others without
|
||||
encrypted_agent = Agent(
|
||||
role="Secure Agent",
|
||||
security_config=SecurityConfig(encrypted_communication=True),
|
||||
# ... other params
|
||||
)
|
||||
|
||||
plain_agent = Agent(
|
||||
role="Regular Agent",
|
||||
security_config=SecurityConfig(encrypted_communication=False),
|
||||
# ... other params
|
||||
)
|
||||
|
||||
# Agent tools automatically handle mixed scenarios:
|
||||
# - Encrypted agents → Encrypted communication
|
||||
# - Non-encrypted agents → Plain communication
|
||||
# - Mixed → Falls back to plain communication with warning
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### What Is Protected
|
||||
|
||||
✅ **Task descriptions and context** passed between agents
|
||||
✅ **Questions and responses** in agent-to-agent communication
|
||||
✅ **Delegation payloads** including sensitive instructions
|
||||
✅ **Agent-to-agent metadata** like sender/recipient information
|
||||
|
||||
### What Is NOT Protected
|
||||
|
||||
❌ **Agent configurations** (roles, goals, backstories)
|
||||
❌ **Task outputs** stored in crew results
|
||||
❌ **LLM API calls** to external services
|
||||
❌ **Tool executions** outside of agent communication
|
||||
|
||||
### Best Practices
|
||||
|
||||
1. **Enable encryption** for sensitive workflows
|
||||
2. **Use unique fingerprints** per deployment/environment
|
||||
3. **Monitor logs** for encryption failures or downgrades
|
||||
4. **Test mixed scenarios** with both encrypted and non-encrypted agents
|
||||
5. **Keep fingerprints secure** - they are used for key derivation
|
||||
|
||||
## Advanced Usage
|
||||
|
||||
### Direct Encryption API
|
||||
|
||||
For advanced use cases, you can use the encryption API directly:
|
||||
|
||||
```python
|
||||
from crewai.security import AgentCommunicationEncryption, Fingerprint
|
||||
|
||||
# Create encryption handlers
|
||||
sender_fp = Fingerprint()
|
||||
recipient_fp = Fingerprint()
|
||||
sender_encryption = AgentCommunicationEncryption(sender_fp)
|
||||
recipient_encryption = AgentCommunicationEncryption(recipient_fp)
|
||||
|
||||
# Encrypt a message
|
||||
message = {"task": "Analyze data", "context": "Q4 results"}
|
||||
encrypted_msg = sender_encryption.encrypt_message(
|
||||
message,
|
||||
recipient_fp,
|
||||
message_type="analysis_request"
|
||||
)
|
||||
|
||||
# Decrypt the message
|
||||
decrypted_msg = recipient_encryption.decrypt_message(encrypted_msg)
|
||||
```
|
||||
|
||||
### Custom Fingerprints
|
||||
|
||||
```python
|
||||
# Generate deterministic fingerprints from seeds
|
||||
fp = Fingerprint.generate(seed="agent-role-environment")
|
||||
|
||||
# Use custom metadata
|
||||
fp = Fingerprint.generate(
|
||||
seed="unique-seed",
|
||||
metadata={"environment": "production", "version": "1.0"}
|
||||
)
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Q: "Message not intended for this agent" error**
|
||||
A: This happens when an agent tries to decrypt a message meant for another agent. Check that the correct recipient agent is being used.
|
||||
|
||||
**Q: "Encryption failed, falling back to plain communication" warning**
|
||||
A: This indicates the encryption process failed and the system fell back to unencrypted communication. Check agent security configurations.
|
||||
|
||||
**Q: Mixed encrypted/non-encrypted agents not working**
|
||||
A: Ensure at least one agent has encryption enabled for the encryption to activate. If no agents have encryption, all communication will be plain text.
|
||||
|
||||
### Debug Logging
|
||||
|
||||
Enable debug logging to see encryption activities:
|
||||
|
||||
```python
|
||||
import logging
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
# Look for log messages like:
|
||||
# DEBUG:crewai.security.encrypted_communication:Encrypted message from abc12345... to def67890...
|
||||
# DEBUG:crewai.tools.agent_tools.base_agent_tools:Executing encrypted communication task...
|
||||
```
|
||||
|
||||
## Performance Impact
|
||||
|
||||
- **Encryption/Decryption**: Minimal overhead (~1-2ms per message)
|
||||
- **Key Derivation**: Cached after first use per agent pair
|
||||
- **Memory**: Small increase for encryption handlers and cached keys
|
||||
- **Network**: No additional network calls (all local encryption)
|
||||
|
||||
## Migration Guide
|
||||
|
||||
### From Non-Encrypted to Encrypted
|
||||
|
||||
1. Add `security_config` to your agent definitions
|
||||
2. No code changes required for agent tools
|
||||
3. Test with mixed encrypted/non-encrypted agents first
|
||||
4. Enable encryption for all agents in production
|
||||
|
||||
```python
|
||||
# Before
|
||||
agent = Agent(role="Analyst", goal="...", backstory="...")
|
||||
|
||||
# After
|
||||
agent = Agent(
|
||||
role="Analyst",
|
||||
goal="...",
|
||||
backstory="...",
|
||||
security_config=SecurityConfig(encrypted_communication=True)
|
||||
)
|
||||
```
|
||||
|
||||
That's it! Your agents will automatically use encrypted communication when both sender and recipient support it.
|
||||
Reference in New Issue
Block a user