From a2574814c2b4e01019ec946bc76f40a8c03086a0 Mon Sep 17 00:00:00 2001 From: Braydon Date: Wed, 28 Aug 2024 11:30:41 -0700 Subject: [PATCH] Initial commit of Secure Profiles. --- xx.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 xx.md diff --git a/xx.md b/xx.md new file mode 100644 index 0000000..299d755 --- /dev/null +++ b/xx.md @@ -0,0 +1,70 @@ +NIP-X +===== + +Secure Profiles +------ + +`draft` `optional` + +This NIP defines a protocol to secure user profile metadata (`kind 0`) with attestations of tags, keys and values. Users can verify other users' profile metadata with a public or private attestations. + +This has several advantages: +* Protection of the impersonation of user profiles. It's possible to verify a user profile without following them. +* An ability to verify different values of the metadata as a user or through a user's web-of-trust. This could be useful for various spam mitigation and filtering techniques. +* Post-compromise security of a profile. The verified NIP-05 nostr address and other values can remain original. This could expand to have additional pubkeys for a profile to help determine honesty. +* Ability to expand into a naming system for (.onion addresses, nostr addresses and etc). +* Granularity, not all metadata is verified, any tag or key/value can be verified and duplicated in the attestation. + +## User Metadata Attestation Event + +This is a parameterized replaceable event with kind `30050`. This is an attestation for another user's metadata (`kind 0`). This will help a user record what public key is associated with what `display_name`, `nip05`, `website` and other metadata. The attestation can be _public_ or _private_. + +Public: +```js +{ + "kind": 30050, + "pubkey": "", + "tags": [ + ["d", ""], + ["p", ""], + ["p", ""], + ["attestation", JSONStringify({ + "pubkey": "" + "tags": [], + "content": { + "": "", + "": "" + } + })] + ], + "content": "" +} +``` + +Private: +```js + "kind": 30050, + "pubkey": "", + "tags": [ + ["d", ""], + ["attestation", JSONStringify({ + "pubkey": "" + "tags": [], + "content": { + "": "", + "": "" + } + })] + ])) +``` + +* For a _public_ attestation: + * The `d` tag and a `p` tag MUST include a public key for the attested to metadata. + * Another `p` tag SHOULD be included if there was a predecessor public key. This helps to inform other users of a link between the predecessor public and a successor public key. + * The `attestations` tag MUST include JSON serialized copy of the attested to event pubkey, tags and content of the `kind 0` event. It is a partial copy of the `kind 0` event. +* For a _private_ attestation: + * The `d` tag MUST be an encrypted and hashed version of the public key (hex encoding of a sha256 hash of an encrypted, with NIP-44, of the public key). + * The `p`, `metadata` and `attestations` tags, as the same as the public attestation, MUST be JSON serialized and NIP-44 encrypted in the content field.