# Crypto

A interface `Crypto` dá acesso a um gerador de números aleatórios criptograficamente forte e a primitivas criptográficas. No Azion Runtime, o objeto global `crypto` é uma instância de `Crypto`, então uma function executa essas operações sem uma biblioteca externa. Para mais informações, consulte [Crypto](https://developer.mozilla.org/en-US/docs/Web/API/Crypto) na MDN Web Docs.

Use `crypto.randomUUID()` para criar identificadores resistentes a colisões para sessões, requisições ou traces. Use `crypto.getRandomValues()` para construir nonces e tokens. Use `crypto.subtle` para gerar o hash ou o digest do payload de uma requisição e verificar sua integridade antes de encaminhá-la. A mesma propriedade valida um token assinado, como um JWT, dentro da function, sem chamada a uma origem.

> **nota**
>
> Com `azion dev`, uma chamada a `crypto.getRandomValues()` com mais de 65.536 bytes lança `QuotaExceededError: The requested length exceeds 65,536 bytes`. Os dois ambientes aceitam 65.536 bytes.

---

## Propriedades

| Propriedade     | Tipo           | Descrição                                                                                                                                                                                                               |
| --------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `crypto.subtle` | `SubtleCrypto` | Dá acesso a primitivas criptográficas comuns, como hash, assinatura, criptografia e descriptografia. Para mais informações, consulte [SubtleCrypto](/pt-br/documentacao/devtools/runtime/api-reference/subtle-crypto/). |

---

## Métodos

| Método                               | Descrição                                                                                                                                |
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `crypto.getRandomValues(typedArray)` | Preenche o typed array que você passa com valores aleatórios criptograficamente fortes e o retorna. Aceita até 65.536 bytes por chamada. |
| `crypto.randomUUID()`                | Retorna um UUID versão 4 gerado aleatoriamente, uma string de 36 caracteres.                                                             |

Uma chamada a `crypto.getRandomValues()` com mais de 65.536 bytes lança uma exceção. O valor que um bloco `catch` recebe é `undefined`, não um objeto de erro: ele não tem `name` nem `message`. Mantenha cada chamada em até 65.536 bytes.

---

## Exemplo

Este handler gera um UUID com `crypto.randomUUID()` e o retorna com seu comprimento e com a indicação de que ele corresponde ou não ao formato da versão 4:

```javascript
export default {
  async fetch(request, env, ctx) {
    const uuid = crypto.randomUUID();
    return Response.json({
      value: uuid,
      length: uuid.length,
      v4: /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(uuid),
    });
  },
};
```

A function retorna estes valores. O UUID muda a cada chamada:

```json
{
 "value": "86cdb8d1-d6c9-44bd-9d61-07812b71c758",
 "length": 36,
 "v4": true
}
```

---

## Recursos relacionados

- [SubtleCrypto](/pt-br/documentacao/devtools/runtime/api-reference/subtle-crypto.md): As operações de hash, assinatura, criptografia e chaves por trás de `crypto.subtle`.
- [CryptoKey](/pt-br/documentacao/devtools/runtime/api-reference/crypto-key.md): O objeto de chave que os métodos de `crypto.subtle` geram, importam e usam.
- [node:crypto](/pt-br/documentacao/devtools/runtime/node/crypto.md): O módulo crypto do Node.js, para código que importa `node:crypto`.
- [Web APIs](/pt-br/documentacao/devtools/runtime/api-reference/javascript.md): As outras Web APIs que o Azion Runtime suporta.
