Stealthicons

Secure Identicons

Identicons are pictures of data, and have been adapted to cryptocurrency addresses to quickly help a sender identify the address, without examining the full address. The pictorial representation adds a level of security. However, as computing power has grown, and phishing has gotten more sophisticated, identicon security has not kept up.

Enter Stealthicons. Stealthicons are a combination of a picture of the data and a five-letter pseudoword, both tied to a computationally expensive cryptographic hash of the data. The result is a quick way to verify an address that is practically impossible to spoof. A phisher would have to grind the picture, the pseudoword, and the address itself to fool a victim, at a cost far too great for even a targeted phishing attack.

This web page is a demo and workbench. Enter some data, play with the controls, and create Stealthicons derivatives that capture the personality of your project. Or use the Stealthicons library with the default settings for fully conformant identicons. Or, if you just want to create Stealthicons for your address book, head over to stealthicons.stealth.org, bookmark it, and enter your address to get started.

At size

64, 32 and 16 pixels

Name


Mark settings

waiting for text
2
6

Marks

variants counted from the generator's own decisions

Hexagonal Stealthicons are the official style. They are laid out on a hexagonal grid, like a honeycomb, with the honeycomb hexagons laid on their sides, forming rows. Each dot on that grid lies at the center of a hexagon. Hexagonal Stealthicon sizes can be expressed by either odd or even numbers, and the number determines the layout (row lengths). For even numbers, the rows are n−1, n, n−1 … — for example, if the number is 4 (n = 4), the rows are 3, 4, 3, 4. For odd numbers the rows are n−2, n−1, n, n−1, n … — for example, for n = 5, the rows are 3, 4, 5, 4, 5. Dots may be connected by "waists," which are drawn to create smooth curves. The result is "chains" that originate from the midline (the vertical line of symmetry of the image) and grow outward. Chains take root on the midline and walk outward, extending with probability D / (1 + steps/W) so they thin as they lengthen; each dot may bifurcate once; adjacent leaves of one color then close with probability Closure. Everything is mirrored, and a dot adjacent to its own mate is always joined.

Face-like Stealthicons have one dot two thirds of the way across the image and a third of the way down. The mirror symmetry around the midline turns this dot into a pair of eyes. These dots carry no connections, are rendered in the accent color, and any other dot left unconnected is joined to a neighbor, taking that neighbor's color. If these lone dots have no neighbors, one will be created. A dot exactly on the midline is exempt from requiring a connection to a neighbor, having no symmetry mate. These constraints make the two mirror dots look strikingly like eyes, giving face-like icons a distinctive personality.

Rectilinear Stealthicons have the square grid (instead of the hexagonal grid). Each color chain grows outward from a single cell on the mirror line, so no color is ever split into islands. Density sets how much of the grid to fill. The density is divided between the various foreground colors of the image. The growth rule loosens as density climbs, or the image would stop growing chains at about half-full. A third shape in a third foreground color is seeded on the mirror line too, the one place it can sit without its own reflection becoming a second, disconnected island, so it appears whenever it can, given that it won't create isolated dots.

Circular dots are joined by two circular fillets tangent to both dots. The Waist slider sets the neck as a fraction of the dot's diameter and the so-called fillet radius is solved such that the arc always leaves the circumference tangentially. This means the connection never develops a corner. When the Waist slider is 1, the connections are a straight bar as wide as the dot diameter. Hexagon dots share the lattice's own orientation, wherein their flat sides face each of their six neighbors. Hexagon connectors are as wide as the hexagon is tall, which is the distance from one vertex to the vertex diametrically across the hexagon.

Color combinations are generated for this project: a base hue at a 15° step, the two dot hues offset by a classic harmony angle, and saturation and lightness drawn from a small curated set. Each one already clears a 5.5 contrast ratio against its own background before it's ever used; the repair step is a safety net, moving lightness alone — hues and saturations untouched — and never letting contrast fall below 3.5. Transparent drops the background entirely. The setting named On dark excludes palettes whose foreground colors don't have enough contrast on a dark background; leaving this option off excludes palettes whose foreground colors don't have enough contrast on a light background. The Transparent setting is a huge decision, and probably not advisable unless you have a very good reason. It commits your project to using either light backgrounds or dark backgrounds for your Stealthicons, which can be extra work to manage.

Grind resistance

The Stealthicon image is seeded from a single 128-bit slice of the cryptographic digest, which puts an upper limit on the variety of Stealthicon images: 2128, or 340 trillion trillion trillion. The practical consequence is that Stealthicons never need to be bigger than 8×8. Larger images can have more detail, but no more distinctness, and therefore no more security. Bear in mind that 8×8 is exceedingly secure.

To successfully fool a Stealthicon user into sending to the wrong address, a forger needs to grind (1) an address that passes for yours (not difficult), (2) the same name (somewhat difficult), and (3) a Stealthicon image close enough to fool the user at a glance (practically impossible). The name and the Stealthicon image are independently derived from the same data, so their difficulty doesn't simply add; it multiplies. Each attempt costs one full memory-hard Argon2d hash, which is well over one tenth of a second on a modern computer. Even more computing power helps little, because the memory cost prevents cheap parallelization. In other words, an attacker buys lanes with RAM rather than with cores.

Name settings

the alphabet the five letters are drawn from
Say it:

Name derivation

each step takes a remainder, then divides it out
StepDivisorRemainderBitsResult
Type something above.

The name is drawn from the first 64 bits of the memory-hard Argon2d cryptographic digest, spent low-order bit first by repeated divmod. The first division picks the so-called "shape" (vowel-first or consonant-first) and the next five pick the letters, such that they match the shape.

Bit ledger

Waiting for text.

bit 0every bit of the digest, and what spends itbit 255

The numbering counts position, not significance. bit 0 is the digest's first, most-significant bit — bytes run left to right in the order the hash produced them, and within each byte the most significant bit comes first, so the least significant bit of any byte sits at the right edge of its 8-cell group. A value's low-order bits are therefore never near bit 0; they sit at the right edge of whichever window that value is drawn from — which is why the name's used bits hug the boundary with mark seed instead of the left edge of the strip.

Hashing

the expensive part

These settings sit at the bottom because they are the settings you are least likely to touch, not because they are least important — they establish the grind cost described above. The defaults are chosen to keep a single evaluation fast enough that this page stays responsive while still costing a forger real memory and computational power for every guess. Argon2d runs with the fixed salt stealthicons-v1, so a stealthicon has to be solely a function of its address. Nothing varies from user to user, and the cost parameters carry the defense instead. Typing the address text is debounced to prevent a laggy user interface, and the digest is cached so changing a setting doesn't trigger a new Argon2d calculation, which could also cause lag.

The pseudoword name and Stealthicon image both derive from the Argon2d digest alone, so a Stealthicon is a pure function of its text.
On this page, hashing happens in your browser. The SHA family comes from Web Crypto. The memory-hard option (default) is a bundled Argon2 implementation. Nothing you type leaves the page.
Color combinations and generators are both original to this project.