🔥 An encrypted, in-memory, key-value store
Uses homomorphic encryption, so the server can’t read data or queries. Powered by HElib and follows the Redis protocol.
Learn how it works.
Designed for research and education, and should not be considered secure. For a more practical approach to key-value store encryption, check out Cloak.
Installation
On Mac, run:
brew install ankane/brew/morph --head
On other platforms, build from source.
Getting Started
Generate a key pair
Start the server (in another window)
Set a key
morph-cli set hello worldNote: Each key should only be set once, or the value will not be recoverable
Get a key
Set multiple keys
morph-cli mset key1 hello key2 world
Get multiple keys
Delete all keys
Get the number of keys
List keys
Get info
Time Complexity
- set - O(1)
- get - O(N) where N is the number of keys in the store
- mset - O(N) where N is the number of keys to set
- mget - O(N*M) where N is the number of keys to get and M is the number of keys in the store
- keys - O(N) where N is the number of keys in the store
Clients
C++
Create hello.cpp:
#include <iostream> #include <morph/client.h> int main() { auto morph = morph::Client(); morph.flushall(); morph.set("hello", "world"); auto value = morph.get("hello"); std::cout << value.value_or("(nil)") << std::endl; }
Compile:
g++ -std=c++17 hello.cpp -lmorph -lpthread -lhelib -lntl -o hello
And run:
Building from Source
First, install HElib.
On Ubuntu, use:
sudo apt-get install libntl-dev git clone --branch v2.3.0 https://github.com/homenc/HElib.git cd HElib cmake -S . -B build cmake --build build sudo cmake --install build sudo ldconfig
On Mac, use:
Then run:
git clone https://github.com/ankane/morph.git cd morph cmake -S . -B build cmake --build build cmake --install build # optional, may need sudo
Credits
Thanks to IBM for HElib and Redis for the protocol/commands. Based on this example.
History
View the changelog
Contributing
Everyone is encouraged to help improve this project. Here are a few ways you can help:
- Report bugs
- Fix bugs and submit pull requests
- Write, clarify, or fix documentation
- Suggest or add new features