|
1 | 1 | # S/Kademlia: A practicable approach towards secure key-based routing |
2 | | -> *[paper](https://www.researchgate.net/publication/4319659_SKademlia_A_practicable_approach_towards_secure_key-based_routing)* |
| 2 | +> *[paper](https://www.researchgate.net/publication/4319659_SKademlia_A_practicable_approach_towards_secure_key-based_routing)* |
| 3 | +
|
| 4 | +Common service is the *key-based routing layer* (KBR). This layer provides efficient routing to identifiers called *keys* from a large *identifier space*. Every participating node in the overlay chooses a unique *nodeId* from the same id space and maintains a routing table with `nodeId`s and IP addresses of neighbors in the overlay topology. |
| 5 | + |
| 6 | +Depending on the overlay protocol, the topology resembles a ring, hypercube, or de Bruijn graph. Every node is responsible for a particular range of the identifier space, usually for all keys close to its *nodeId* in the id space. |
| 7 | + |
| 8 | +> KBR is used to efficiently route a message to an arbitrary key by successively forwarding the message to overlay neighbors which have a *nodeId* closer to the destination key. |
| 9 | +
|
| 10 | +## motivation |
| 11 | + |
| 12 | +prevents sybil attacks on the address space by creating a minimum work threshold for node generation (storage NodeId generation requires *trailing* bits of 0s `=>` slows down process of adding new nodes) |
| 13 | + |
| 14 | +## objects and behavior |
| 15 | + |
| 16 | +### Secure `nodeId` assignment (section 4.1) |
| 17 | + |
| 18 | +#### generate `nodeId` |
| 19 | + |
| 20 | +hash over a public key |
| 21 | + |
| 22 | +#### message signatures |
| 23 | + |
| 24 | +To sign messages exchanged by nodes, differentiate between two signature types: |
| 25 | +1. `weak_signature`: does not sign the whole message (limited to IP address, port, and a timestamp) `=>` use timestamp to determine how long the signature is valued (to prevent replay attacks); used for `FIND_NODE` and `PING` messages where the integrity of the whole message is dispensable |
| 26 | +2. `strong_signature`: signs the full content of a message (to ensure integrity and resilience againt Man-in-Middle attacks); replay attacks prevented with nonces inside RPC messages. |
| 27 | + |
| 28 | +Use `crypto_puzzle_sig` to impede Eclipse and Sybil attacks |
| 29 | +* `static_puzzle` impedes how the *nodeId* can be chosen freely |
| 30 | +* `dynamic_puzzle` ensures that it is complex to generate a huge amount of *nodeId*s |
| 31 | + |
| 32 | +### reliable sibling broadcast |
| 33 | + |
| 34 | +Common security problem is the reliability of sibling information which arises when replicated information needs to be stored in the DHT which uses a majority decision to compensate for adversarial nodes. |
| 35 | +> see [10](http://www.cs.kent.edu/~javed/class-IAD06S/papers-2004/gai.pdf) for definition of a *sibling* list to manage certain lists of `(key, value)` pairs |
| 36 | +
|
| 37 | +The **routing table** consists of a list of `N` k-buckets holding nodes with a distance `d` with `2^{i - 1} \leq d \less 2^i, 0 \leq i \leq n` and a sorted list of siblings of size `n_sigma * s` |
| 38 | + |
| 39 | +#### routing table maintenance |
| 40 | + |
| 41 | +Categorize signalling messages to the following classes: |
| 42 | +* incoming signed RPC requests |
| 43 | +* responses |
| 44 | +* unsigned messages |
| 45 | + |
| 46 | +Each message contains the **sender address**. The sender address is *valid* if the message is signed and *actively valid*... |
| 47 | + |
| 48 | +Actively valid sender addresses are immediately added to their corresponding bucket, when it is not full. Valid sender addresses are only added to a bucket if the *nodeId* prefix differs in an appropriate amount of bits `\psi` (`\psi > 32`). |
| 49 | +> sender addresses that come from unsigned messages will be ignored |
| 50 | +
|
| 51 | +### lookup over disjoint paths |
| 52 | + |
| 53 | +use `d` disjoint paths to increase the lookup success ratio in a network with adversarial nodes; by using the sibling list, the lookup doesn't converge at a single node but terminates on *d* close-by neighbors, which all know the complete *s* siblings for the destination keys `=>` lookup is still successful even if `k-1` of the neighbors are adversarial |
0 commit comments