haven't taken security course when I made this. If I were to make such app now, a few changes would have been made:
- Instead of plain TCP connection, I would look for TLS libraries
- Dilemma below could be solved by either
- trust a Certificate Authority
- adopt DPKI, make use of block chain to exchange key pairs
- Use
thiserror
to define my error types - Use
tonic
(grpc) oraxum
(http) instead of making my own protocol - Replace the encryption library by openssl bindings
- Avoid some silly code in my current perspective
-
Users do trust
Client
(They build it from source) -
Client
can decide not to trustServer
(By default public keys are exchanged through server)- User may manually set other's public key via third party communication
- A pre-configured dummy message is sent if the key delivered by server is not identical
- with warnings on client side
- dummy message is encrypted by server's public key
Client
behaves as if it hasn't discoveredServer
's fraud
-
Client
can decide not to trust user's device- Private key is encrypted on local disk and decrypted by server during connection
In short, this project assumes that the server and the current computer user are malicious. Our goal is to have each potential hostile hold one piece of the puzzle, so that information leaks only if they refer to the same individual.
It is quite inconvenient to manually exchange public keys when users don't trust the server, but for now I am not aware of any alternative solution.
Ideally, users expect the following would happen when they send a message
However, no one can prevent the server from doing this
Feature | Status | Source Path | Lib |
---|---|---|---|
Application Protocol | Done | core/src/codec/msg_codec.rs | tokio-util |
Message Delivery | Done | server/src/process.rs | N/A |
Log | Done | server/src/init.rs | tracing |
Config | Done | core/src/config.rs | serde + toml |
Client Encryption | Done | core/encryption/rsa_impl.rs | RustCrypto/rsa |
Customizable Encryption | Done | core/traits/encrypt.rs | N/A |
Exchange Public Key | Done | server/src/process.rs | N/A |
Offline Pubkey Mode | Coming Next | N/A | |
Update Key Strategy | Coming Next | N/A | |
Authentication | To Do | TBD | |
Unsafe Group Chat | To Do | N/A | |
Expensive Group Chat (e2ee) | To Do | N/A | |
File Server (RSA + AES) | To Do | RustCrypto/aes | |
Encrypt Private Keys on Client | To Do | TBD | |
Chat History Persistence | To Do | diesel | |
Horizontal Scaling | To Do | TBD |
git clone https://github.com/realzhujunhao/jhchat.git
cd jhchat
cargo build --release