@growy/strapi-plugin-encrypted-field 2.3.0 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +109 -170
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -6,41 +6,39 @@
6
6
  <img src="https://img.shields.io/badge/Strapi-v5-blueviolet" alt="Strapi v5" />
7
7
  </div>
8
8
 
9
- Plugin oficial de **Growy AI** para Strapi que proporciona un campo personalizado de texto cifrado con AES-256-GCM. Protege información sensible directamente en tu base de datos con cifrado transparente y validación robusta.
9
+ ---
10
10
 
11
+ ### [English](#english-version) | [Español](#versión-en-español)
11
12
 
12
- - ✅ **Campo personalizado** "Texto Cifrado" en el Content-Type Builder
13
- - ✅ **Cifrado automático** AES-256-GCM al guardar
14
- - ✅ **Descifrado transparente** al leer (panel y API)
15
- - ✅ **Validación backend** con soporte para regex y restricciones
16
- - ✅ **UI mejorada** con controles de visibilidad y copiar al portapapeles
17
- - ✅ **Valores ocultos** por defecto con opción de mostrar/ocultar
18
- - ✅ **Notificaciones** de confirmación al copiar valores
19
- - ✅ **Gestión de claves robusta** con validación y mensajes de error claros
20
- - ✅ **Datos cifrados** en base de datos con IV único y Auth Tag
21
- - ✅ **Reutilizable** en cualquier colección o componente
22
- - ✅ **Soporte completo** para componentes anidados y estructuras complejas
13
+ ---
23
14
 
24
- ## Instalación
15
+ ## English Version
25
16
 
26
- ### Desde npm
17
+ Official **Growy AI** plugin for Strapi that provide a custom encrypted text field using AES-256-GCM. Protect sensitive information directly in your database with transparent encryption and robust validation.
27
18
 
28
- ```bash
29
- npm install @growy/strapi-plugin-encrypted-field
30
- ```
19
+ ### Features
20
+
21
+ - ✅ **Custom Field** "Encrypted Text" in the Content-Type Builder.
22
+ - ✅ **Automatic Encryption** AES-256-GCM when saving.
23
+ - ✅ **Transparent Decryption** when reading (Admin panel and API).
24
+ - ✅ **Backend Validation** with regex support and length constraints.
25
+ - ✅ **Native Strapi v5 UI** with visibility controls, redimensionable inputs and copy to clipboard.
26
+ - ✅ **Multi-language support (i18n)**: English and Spanish.
27
+ - ✅ **Encrypted Data** in database with unique IV and Auth Tag.
28
+ - ✅ **Nested Components support** at any depth.
31
29
 
32
- ### Desde yarn
30
+ ### Installation
33
31
 
34
32
  ```bash
33
+ npm install @growy/strapi-plugin-encrypted-field
34
+ # or
35
35
  yarn add @growy/strapi-plugin-encrypted-field
36
36
  ```
37
37
 
38
- ## Configuración
39
-
40
- ### 1. Habilitar el plugin
41
-
42
- Crea o edita `config/plugins.js` o `config/plugins.ts`:
38
+ ### Configuration
43
39
 
40
+ #### 1. Enable the plugin
41
+ Edit `config/plugins.js` or `config/plugins.ts`:
44
42
  ```javascript
45
43
  module.exports = {
46
44
  'encrypted-field': {
@@ -49,199 +47,140 @@ module.exports = {
49
47
  };
50
48
  ```
51
49
 
52
- ### 2. Configurar la clave de cifrado (REQUERIDO)
53
-
54
- #### Opción A: Variable de entorno (recomendado)
55
-
56
- Agrega a tu `.env`:
57
-
50
+ #### 2. Configure Encryption Key (REQUIRED)
51
+ Add to your `.env`:
58
52
  ```bash
59
- ENCRYPTION_KEY=tu_clave_de_64_caracteres_hexadecimales_aqui
53
+ ENCRYPTION_KEY=your_64_character_hex_key_here
60
54
  ```
61
55
 
62
- #### Opción B: Archivo de configuración
63
-
64
- Edita `config/plugins.js`:
65
-
66
- ```javascript
67
- module.exports = ({ env }) => ({
68
- 'encrypted-field': {
69
- enabled: true,
70
- config: {
71
- encryptionKey: env('ENCRYPTION_KEY'),
72
- },
73
- },
74
- });
75
- ```
76
-
77
- #### Generar clave segura
78
-
56
+ **Generate a secure key:**
79
57
  ```bash
80
58
  node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
81
59
  ```
82
60
 
83
- Esto generará una clave de 64 caracteres hexadecimales (32 bytes).
61
+ ⚠️ **CRITICAL - Key Management**:
62
+ - **Store the key safely** (Secrets manager, encrypted env vars).
63
+ - **Never** include it in version control.
64
+ - **If you lose the key**, you will NOT be able to decrypt existing data.
65
+ - **Use the same key** across all environments sharing the same database.
84
66
 
85
- ⚠️ **CRÍTICO - Gestión de claves**:
86
- - **Guarda la clave de forma segura** (gestor de secretos, variables de entorno cifradas)
87
- - **Nunca** la incluyas en el control de versiones
88
- - **Si pierdes la clave**, no podrás descifrar los datos existentes
89
- - **Usa la misma clave** en todos los entornos que compartan la misma base de datos
90
- - **Para producción**, considera usar servicios como AWS Secrets Manager, HashiCorp Vault o similar
67
+ ### Usage & Validation
91
68
 
92
- ### 3. Rebuild del admin
69
+ #### Data Validation
70
+ The plugin supports validation before encryption:
71
+ 1. In Content-Type Builder, select the encrypted field.
72
+ 2. Go to **"Advanced Settings"**.
73
+ 3. In **"RegEx pattern"**, enter your regular expression.
74
+ **Example**: To validate an API key format: `^sk-[a-zA-Z0-9]{32}$`.
93
75
 
76
+ #### API Usage
77
+ The API returns decrypted values automatically for authorized requests.
94
78
  ```bash
95
- npm run build
96
- npm run develop
79
+ # Create an entry
80
+ curl -X POST http://localhost:1337/api/users \
81
+ -H "Content-Type: application/json" \
82
+ -d '{"data": {"apiKey": "my-secret-token"}}'
83
+
84
+ # Read (returns decrypted)
85
+ curl -X GET http://localhost:1337/api/users/1
86
+ # Response: { "data": { "apiKey": "my-secret-token" } }
97
87
  ```
98
88
 
99
- ## Requisitos
89
+ ---
100
90
 
101
- - **Strapi**: v5.0.0 o superior
102
- - **Node.js**: 18.x - 22.x
103
- - **npm**: 6.0.0 o superior
91
+ ## Versión en Español
104
92
 
105
- ## Validación de datos
93
+ Plugin oficial de **Growy AI** para Strapi que proporciona un campo personalizado de texto cifrado con AES-256-GCM. Protege información sensible directamente en tu base de datos con cifrado transparente y validación robusta.
106
94
 
107
- El plugin soporta validación antes del cifrado:
95
+ ### Características
108
96
 
109
- ### Configurar validación regex
97
+ - **Campo personalizado** "Texto Cifrado" en el Content-Type Builder.
98
+ - ✅ **Cifrado automático** AES-256-GCM al guardar.
99
+ - ✅ **Descifrado transparente** al leer (panel y API).
100
+ - ✅ **Validación backend** con soporte para regex y restricciones.
101
+ - ✅ **UI Nativa Strapi v5** con controles de visibilidad, inputs redimensionables y copiar al portapapeles.
102
+ - ✅ **Soporte multi-idioma (i18n)**: Inglés y Español.
103
+ - ✅ **Datos cifrados** en base de datos con IV único y Auth Tag.
104
+ - ✅ **Soporte para componentes anidados** a cualquier profundidad.
110
105
 
111
- 1. En el Content-Type Builder, selecciona el campo cifrado
112
- 2. Ve a la pestaña **"Advanced Settings"**
113
- 3. En **"RegEx pattern"**, ingresa tu expresión regular
114
- 4. Guarda los cambios
106
+ ### Instalación
115
107
 
116
- **Ejemplo**: Para validar formato de API key:
117
- ```regex
118
- ^sk-[a-zA-Z0-9]{32}$
108
+ ```bash
109
+ npm install @growy/strapi-plugin-encrypted-field
110
+ # o
111
+ yarn add @growy/strapi-plugin-encrypted-field
119
112
  ```
120
113
 
121
- Si el valor no cumple con el patrón, se lanzará un error antes de cifrar.
122
-
123
- ## Uso
114
+ ### Configuración
124
115
 
125
- ### 1. Agregar campo cifrado a una colección
126
-
127
- 1. Ve a **Content-Type Builder**
128
- 2. Selecciona una colección o crea una nueva
129
- 3. Click en **"Add another field"**
130
- 4. Busca **"Texto Cifrado"** (con icono 🔒)
131
- 5. Configura el nombre del campo
132
- 6. Guarda y reinicia Strapi
116
+ #### 1. Habilitar el plugin
117
+ Edita `config/plugins.js`:
118
+ ```javascript
119
+ module.exports = {
120
+ 'encrypted-field': {
121
+ enabled: true,
122
+ },
123
+ };
124
+ ```
133
125
 
134
- ### 2. Usar el campo
126
+ #### 2. Configurar la clave (REQUERIDO)
127
+ Agrega a tu `.env`:
128
+ ```bash
129
+ ENCRYPTION_KEY=tu_clave_de_64_caracteres_hexadecimales_aqui
130
+ ```
135
131
 
136
- El campo funciona como un campo de texto normal con características de seguridad adicionales:
132
+ ⚠️ **CRÍTICO - Gestión de claves**:
133
+ - **Guarda la clave de forma segura** (gestor de secretos, variables de entorno cifradas).
134
+ - **Nunca** la incluyas en el control de versiones.
135
+ - **Si pierdes la clave**, NO podrás descifrar los datos existentes.
137
136
 
138
- - **En el panel**: Escribe texto normalmente
139
- - **Valores ocultos**: Los valores se muestran como `***` por defecto
140
- - **Botón ojo**: Alterna entre mostrar/ocultar el valor
141
- - **Botón copiar**: Copia el valor al portapapeles con notificación de confirmación
142
- - **Placeholder personalizable**: Configura un placeholder desde las opciones del campo
143
- - **Al guardar**: Se cifra automáticamente
144
- - **Al leer**: Se descifra automáticamente
145
- - **En la BD**: Se guarda cifrado con formato `iv:authTag:encrypted`
146
- - **En componentes**: Funciona igual en componentes anidados de cualquier profundidad
137
+ ### Uso y Validación
147
138
 
148
- ### 3. Uso por API
139
+ #### Validación de datos
140
+ El plugin soporta validación antes del cifrado:
141
+ 1. En el Content-Type Builder, selecciona el campo cifrado.
142
+ 2. Ve a la pestaña **"Advanced Settings"**.
143
+ 3. En **"RegEx pattern"**, ingresa tu expresión regular.
144
+ **Ejemplo**: Para validar formato de API key: `^sk-[a-zA-Z0-9]{32}$`.
149
145
 
146
+ #### Uso por API
147
+ La API devuelve los valores descifrados automáticamente.
150
148
  ```bash
151
149
  # Crear con campo cifrado
152
150
  curl -X POST http://localhost:1337/api/usuarios \
153
151
  -H "Content-Type: application/json" \
154
- -d '{
155
- "data": {
156
- "nombre": "Juan",
157
- "apiKey": "mi-clave-secreta-123"
158
- }
159
- }'
152
+ -d '{"data": {"apiKey": "mi-clave-secreta-123"}}'
160
153
 
161
154
  # Leer (devuelve descifrado)
162
155
  curl -X GET http://localhost:1337/api/usuarios/1
163
- # Response: { "nombre": "Juan", "apiKey": "mi-clave-secreta-123" }
156
+ # Response: { "apiKey": "mi-clave-secreta-123" }
164
157
  ```
165
158
 
166
- ## Ejemplo de uso
159
+ ### Especificaciones Técnicas
167
160
 
168
- ### Colección "Usuario" con API Key cifrada
161
+ - **Algoritmo**: AES-256-GCM (Grado militar).
162
+ - **IV (Initialization Vector)**: 96 bits generado aleatoriamente por operación.
163
+ - **Integridad**: Auth Tag de 128 bits para detectar manipulaciones.
164
+ - **Formato almacenado**: `iv:authTag:encryptedData`.
169
165
 
170
- **Schema:**
171
- ```json
172
- {
173
- "nombre": "string",
174
- "email": "email",
175
- "apiKey": "plugin::encrypted-field.encrypted-text"
176
- }
177
- ```
166
+ ### Limitaciones Conocidas
178
167
 
179
- **En la BD:**
180
- ```
181
- apiKey: "a1b2c3d4e5f6....:f9e8d7c6b5a4....:9f8e7d6c5b4a3..."
182
- ```
168
+ - ❌ **Búsqueda**: No se puede buscar por campos cifrados debido al cifrado en BD.
169
+ - ❌ **Ordenamiento**: No se puede ordenar por campos cifrados.
170
+ - ❌ **Filtros**: No se pueden aplicar filtros directos en la consulta a la BD.
183
171
 
184
- **En el panel y API:**
185
- ```
186
- apiKey: "sk-1234567890abcdef"
187
- ```
188
-
189
- ## Seguridad y arquitectura
190
-
191
- ### Especificaciones técnicas
192
-
193
- - **Algoritmo**: AES-256-GCM (estándar NIST, grado militar)
194
- - **Tamaño de clave**: 256 bits (32 bytes, 64 caracteres hexadecimales)
195
- - **IV (Initialization Vector)**: 96 bits (12 bytes) generado aleatoriamente por operación
196
- - **Auth Tag**: 128 bits (16 bytes) para verificación de integridad
197
- - **Formato almacenado**: `iv:authTag:encryptedData` (todos en hexadecimal)
198
-
199
- ### Características de seguridad
200
-
201
- - ✅ **Cifrado autenticado**: GCM proporciona confidencialidad e integridad
202
- - ✅ **IV único**: Cada operación de cifrado genera un IV aleatorio
203
- - ✅ **Resistencia a manipulación**: Auth Tag detecta cualquier modificación
204
- - ✅ **Validación de entrada**: Soporte para regex y restricciones personalizadas
205
- - ✅ **Manejo de errores seguro**: Logs controlados sin exponer datos sensibles
206
-
207
- ### Mejores prácticas
208
-
209
- 1. **Rotación de claves**: Planifica un proceso de rotación periódica
210
- 2. **Separación de entornos**: Usa claves diferentes para dev/staging/prod
211
- 3. **Auditoría**: Monitorea logs de errores de cifrado/descifrado
212
- 4. **Backup de claves**: Mantén copias seguras de las claves en múltiples ubicaciones
213
- 5. **Campos privados**: Marca campos sensibles como "privados" para excluirlos de la API pública
214
-
215
- ## Casos de uso
216
-
217
- - 🔑 API Keys de terceros
218
- - 🔐 Tokens de acceso
219
- - 🔒 Secretos de webhooks
220
- - 💳 Información sensible
221
- - 📧 Credenciales SMTP
222
- - 🔑 Contraseñas de aplicaciones
223
-
224
- ## Limitaciones conocidas
225
-
226
- - ❌ **Búsqueda**: No se puede buscar por campos cifrados (datos cifrados en BD)
227
- - ❌ **Ordenamiento**: No se puede ordenar por campos cifrados
228
- - ❌ **Filtros**: No se pueden aplicar filtros directos sobre campos cifrados
229
- - ⚠️ **Rendimiento**: El cifrado/descifrado añade overhead mínimo (~1-2ms por operación)
230
- - ⚠️ **Sincronización de claves**: Todos los entornos que compartan BD deben usar la misma clave
231
-
232
- ## Licencia
172
+ ---
233
173
 
174
+ ## License / Licencia
234
175
  MIT © 2025 Growy AI
235
176
 
236
- ## Desarrollado por
237
-
177
+ ## Credits / Créditos
238
178
  **Growy AI** - Soluciones de IA y automatización empresarial
239
-
240
- **Autor principal**: Zahir El isaac
179
+ **Main Author / Autor principal**: Zahir El isaac
241
180
 
242
181
  ---
243
182
 
244
183
  <div align="center">
245
- <p>Si este plugin te resulta útil, considera darle una ⭐ en GitHub</p>
246
- <p>Hecho con ❤️ por el equipo de Growy AI</p>
184
+ <p>If this plugin is useful to you, consider giving it a ⭐ on GitHub / Si este plugin te resulta útil, considera darle una ⭐ en GitHub</p>
185
+ <p>Made with ❤️ by Growy AI Team</p>
247
186
  </div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growy/strapi-plugin-encrypted-field",
3
- "version": "2.3.0",
3
+ "version": "2.3.2",
4
4
  "description": "Campo personalizado de texto cifrado para Strapi",
5
5
  "strapi": {
6
6
  "name": "encrypted-field",