Why Nostr? What is Njump?
2024-03-26 22:11:27

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.
Author Public Key
npub1uykpm4luredxa7spwas287eewlhykl79rxauagl88ufhggvyk4tsl7w258