Encrypted

A post other frontends can’t render

01

What is written

02

What goes on the chain

The body is replaced by its ciphertext, and one attribute says what happened to it. This is AES-GCM, computed in this browser as you type, not an illustration of one.

{
  "app": "openattribute/0.1",
  "tags": [
    "openattribute"
  ],
  "openattribute.encryption": {
    "scheme": "app-shared"
  }
}

Nothing else is in there. It said which key as well, until the obvious was pointed out: anybody can write any attribute, so a key name in public metadata is a label saying which era a post belongs to, published for people who cannot open it either way. Rotation works without it, because a wrong key fails cleanly and an application holding several simply tries each.

03

What a reader gets

@openattribute

Read back with the key this application holds. The post on chain has not changed.

04

What this is not

Obfuscation, not confidentiality. The key is shared by every copy of the application, so it is in every browser that opens it, so anybody willing to open a developer console has it. That is not a flaw waiting to be fixed. It is what a shared key is, and a key a million readers can use is a key a million readers hold.

The secret this page encrypts with is a shared secret, and this page is where it stops being one, written into the source deliberately. Hiding it here would be arguing the opposite of the argument.

What it does buy is real, and it is a product property rather than a security one: content that does not render as prose anywhere else, is not picked up by anything scraping the chain casually, and reads properly only where you meant it to. For anything that harms somebody when another person reads it, this is the wrong tool and no amount of key management makes it the right one.

The attribute is openattribute.encryption, which any frontend can look up in the register without having seen this page.