{"id":"20cb1b25f0a09fb751338adca775bb553299327193f348e0bf670ed92b9f2e30","pubkey":"b22b06b051fd5232966a9344a634d956c3dc33a7f5ecdcad9ed11ddc4120a7f2","created_at":1759690921,"kind":30817,"tags":[["d","password-manager"],["title","Password manager"],["k","4111"],["client","nostrhub.io"]],"content":"# NIP-XX\n\n## Password manager\n\n`draft` `optional`\n\nThis NIP defines a standard for storing secrets.\n\n## Templates\n\n### Secret\n\n```jsonc\n{\n    \"id\": \"<random id>\", // for versioning\n    \"title\": \"<secrettitle>\",\n    \"fields\": [\"<field 1>\", \"<field 2>\", \"<field 3>\", \"...\"],\n    \"urls\": [\"<website url>\"],\n    \"note\": \"<note content>\"\n}\n```\n\n### Fields\n\n#### Text\n\n```jsonc\n{\n    \"name\": \"<field name>\",\n    \"kind\": \"text\",\n    \"value\": \"<visible text>\"\n}\n```\n\n#### Secret text\n\nSame as [Text](#text), but the client `MUST` hide the value.\n\n```jsonc\n{\n    \"name\": \"<field name>\",\n    \"kind\": \"secret\",\n    \"value\": \"<field value>\"\n}\n```\n\n#### OTP\n\n```jsonc\n{\n    \"name\": \"OTP\",\n    \"kind\": \"otp\",\n    \"value\": {\n        \"type\": \"<totp|hotp>\",\n        \"secret\": \"<otp secret>\",\n        \"algorithm\": \"<SHA1|SHA256|SHA512>\",\n        \"digits\": 6,\n        \"period\": 30,\n        \"counter\": 0,\n    }\n}\n```\n\n## Sending to relays\n\nThe content must be json stringified and then encrypted using [NIP-44](https://github.com/nostr-protocol/nips/blob/master/44.md).\n\n```jsonc\n{\n    \"kind\": 4111,\n    \"content\": \"nip44.encrypt(JSON.stringify(<secret>))\"\n}\n```\n\n## Secret sharing\n\nTo share a secret you must add a \"p\" tag with the recipient pubkey and you must encrypt the content using [NIP-44](https://github.com/nostr-protocol/nips/blob/master/44.md) and his pubkey.\n\n```jsonc\n{\n    \"kind\": 4111,\n    \"tags\": [\n        [\"p\", \"<recipient pubkey>\"],\n    ],\n    \"content\": \"nip44.encrypt(JSON.stringify(<secret>), <recipient pubkey>)\"\n}\n```\n\n## Delete a secret\n\nUse [NIP-09](https://github.com/nostr-protocol/nips/blob/master/09.md) to delete a secret.\n\n## Example\n\n### Create a secret\n\n```jsonc\n{\n    \"id\": \"XkjfyZQEJvsy2Fkz\",\n    \"title\": \"Github\",\n    \"fields\": [\n        {\n            \"name\": \"Name\",\n            \"kind\": \"text\",\n            \"value\": \"Bob\"\n        },\n        {\n            \"name\": \"Email\",\n            \"kind\": \"text\",\n            \"value\": \"bob@nostr-mail.com\"\n        },\n        {\n            \"name\": \"Password\",\n            \"kind\": \"secret\",\n            \"value\": \"=[s8p!Nd#KCX6(@r\"\n        },\n        {\n            \"name\": \"OTP\",\n            \"kind\": \"otp\",\n            \"value\": {\n                \"type\": \"totp\",\n                \"secret\": \"JBSWY3DPEHPK3PXP\",\n                \"algorithm\": \"SHA1\",\n                \"digits\": 6,\n                \"period\": 30\n            }\n        }\n    ],\n    \"note\": \"My main github account\"\n}\n```\n\n### Update a secret\n\n```jsonc\n{\n    \"id\": \"XkjfyZQEJvsy2Fkz\", // keep the same id\n    \"title\": \"Github\",\n    \"urls\": [\"https://github.com\"], // update\n    \"fields\": [\n        {\n            \"name\": \"Name\",\n            \"kind\": \"text\",\n            \"value\": \"Bob\"\n        },\n        {\n            \"name\": \"Email\",\n            \"kind\": \"text\",\n            \"value\": \"bob@nostr-mail.com\"\n        },\n        {\n            \"name\": \"Password\",\n            \"kind\": \"secret\",\n            \"value\": \"=[s8p!Nd#KCX6(@r\"\n        },\n        {\n            \"name\": \"OTP\",\n            \"kind\": \"otp\",\n            \"value\": {\n                \"type\": \"totp\",\n                \"secret\": \"JBSWY3DPEHPK3PXP\",\n                \"algorithm\": \"SHA1\",\n                \"digits\": 6,\n                \"period\": 30\n            }\n        }\n    ],\n    \"note\": \"My github account\" // update\n}\n```","sig":"1446fa1c33d64fe8ccbd95c1c922668e4410c84a97627946505aaf6c963a760fc5d98cf4ff7d5d9d0dc3d4b86ad9cb544b3da229f9f935802c7697abcbe85616"}