5967820 on Nostr: #tuxdobananil #explains #nips #nip-04 # NIP-04: Mensagens Diretas Criptografadas 🔒 ...
#tuxdobananil #explains #nips #nip-04
# NIP-04: Mensagens Diretas Criptografadas 🔒
## Visão Geral
NIP-04 define um evento de tipo `4` para "mensagem direta criptografada", permitindo a comunicação privada entre usuários na rede Nostr. No entanto, é marcado como `unrecommended` e foi substituído pelo NIP-44 devido a preocupações de segurança.
### Atributos
- **`content`**: String criptografada com AES-256-CBC, codificada em base64, seguida pelo vetor de inicialização (IV) também em base64.
- **`tags`**: Deve incluir uma entrada para identificar o receptor (`["p", "<pubkey>"]`) e pode incluir uma entrada para identificar a mensagem anterior na conversa (`["e", "<event_id>"]`).
### Geração da Mensagem
A chave compartilhada é gerada combinando a chave pública do destinatário com a chave privada do remetente, usando apenas a coordenada X do ponto compartilhado, sem aplicar hash. Isso é usado como a chave para a criptografia AES-256-CBC da mensagem.
### Exemplo de Código
Um exemplo em JavaScript para gerar tal evento usando `@noble/secp256k1` e o módulo `crypto`:
```js
import crypto from 'crypto'
import * as secp from '@noble/secp256k1'
let sharedPoint = secp.getSharedSecret(ourPrivateKey, '02' + theirPublicKey)
let sharedX = sharedPoint.slice(1, 33)
let iv = crypto.randomFillSync(new Uint8Array(16))
var cipher = crypto.createCipheriv(
'aes-256-cbc',
Buffer.from(sharedX),
iv
)
let encryptedMessage = cipher.update(text, 'utf8', 'base64')
encryptedMessage += cipher.final('base64')
let ivBase64 = Buffer.from(iv.buffer).toString('base64')
let event = {
pubkey: ourPubKey,
created_at: Math.floor(Date.now() / 1000),
kind: 4,
tags: [['p', theirPublicKey]],
content: encryptedMessage + '?iv=' + ivBase64
}
```
## Advertências de Segurança
Este padrão está longe do estado da arte em comunicação criptografada e vaza metadados, portanto, **não deve ser usado** para comunicações verdadeiramente secretas. Use apenas com relays que implementam autenticação (`AUTH`) para restringir quem pode acessar seus eventos de tipo `4`.
## Aviso para Implementação em Clientes
Clientes **não devem** buscar e substituir referências de chaves públicas ou notas no `.content`. Processar a mensagem como uma nota de texto regular expõe as tags e permite que o usuário mencionado receba a mensagem em sua caixa de entrada.
Published at
2024-03-26 22:11:27Event JSON
{
"id": "1fd9492fd1c20b40bd7713a4b6cb2cee0525978822fc4a7d4facd797085c9e00",
"pubkey": "e12c1dd7fc1e5a6efa017760a3fb3977ee4b7fc519bbcea3e73f13742184b557",
"created_at": 1711491087,
"kind": 1,
"tags": [
[
"t",
"tuxdobananil"
],
[
"t",
"explains"
],
[
"t",
"nips"
],
[
"t",
"nip"
]
],
"content": "#tuxdobananil #explains #nips #nip-04\n\n# NIP-04: Mensagens Diretas Criptografadas 🔒\n\n## Visão Geral\n\nNIP-04 define um evento de tipo `4` para \"mensagem direta criptografada\", permitindo a comunicação privada entre usuários na rede Nostr. No entanto, é marcado como `unrecommended` e foi substituído pelo NIP-44 devido a preocupações de segurança.\n\n### Atributos\n\n- **`content`**: String criptografada com AES-256-CBC, codificada em base64, seguida pelo vetor de inicialização (IV) também em base64.\n- **`tags`**: Deve incluir uma entrada para identificar o receptor (`[\"p\", \"\u003cpubkey\u003e\"]`) e pode incluir uma entrada para identificar a mensagem anterior na conversa (`[\"e\", \"\u003cevent_id\u003e\"]`).\n\n### Geração da Mensagem\n\nA chave compartilhada é gerada combinando a chave pública do destinatário com a chave privada do remetente, usando apenas a coordenada X do ponto compartilhado, sem aplicar hash. Isso é usado como a chave para a criptografia AES-256-CBC da mensagem.\n\n### Exemplo de Código\n\nUm exemplo em JavaScript para gerar tal evento usando `@noble/secp256k1` e o módulo `crypto`:\n\n```js\nimport crypto from 'crypto'\nimport * as secp from '@noble/secp256k1'\n\nlet sharedPoint = secp.getSharedSecret(ourPrivateKey, '02' + theirPublicKey)\nlet sharedX = sharedPoint.slice(1, 33)\n\nlet iv = crypto.randomFillSync(new Uint8Array(16))\nvar cipher = crypto.createCipheriv(\n 'aes-256-cbc',\n Buffer.from(sharedX),\n iv\n)\nlet encryptedMessage = cipher.update(text, 'utf8', 'base64')\nencryptedMessage += cipher.final('base64')\nlet ivBase64 = Buffer.from(iv.buffer).toString('base64')\n\nlet event = {\n pubkey: ourPubKey,\n created_at: Math.floor(Date.now() / 1000),\n kind: 4,\n tags: [['p', theirPublicKey]],\n content: encryptedMessage + '?iv=' + ivBase64\n}\n```\n\n## Advertências de Segurança\n\nEste padrão está longe do estado da arte em comunicação criptografada e vaza metadados, portanto, **não deve ser usado** para comunicações verdadeiramente secretas. Use apenas com relays que implementam autenticação (`AUTH`) para restringir quem pode acessar seus eventos de tipo `4`.\n\n## Aviso para Implementação em Clientes\n\nClientes **não devem** buscar e substituir referências de chaves públicas ou notas no `.content`. Processar a mensagem como uma nota de texto regular expõe as tags e permite que o usuário mencionado receba a mensagem em sua caixa de entrada.",
"sig": "f1758a49da5c3ddc59e42b7ae687911245f30bf87c1ab9842678d6b5f0c2fc6fdb3051f9f6ee1097a804df3368248d908987d08f173281f7199a3c5bd6282c25"
}