@growy/strapi-plugin-encrypted-field 2.3.0 → 2.3.1
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.
- package/README.md +84 -171
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,40 +6,41 @@
|
|
|
6
6
|
<img src="https://img.shields.io/badge/Strapi-v5-blueviolet" alt="Strapi v5" />
|
|
7
7
|
</div>
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
---
|
|
10
10
|
|
|
11
|
+
### [English](#english-version) | [Español](#versión-en-español)
|
|
11
12
|
|
|
12
|
-
|
|
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
|
-
##
|
|
15
|
+
## English Version
|
|
25
16
|
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
npm install @growy/strapi-plugin-encrypted-field
|
|
30
|
-
```
|
|
19
|
+
### Features
|
|
31
20
|
|
|
32
|
-
|
|
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 and copy to clipboard.
|
|
26
|
+
- ✅ **Multi-language support (i18n)**: English and Spanish.
|
|
27
|
+
- ✅ **Secure Key Management** with validation and clear error messages.
|
|
28
|
+
- ✅ **Encrypted Data** in database with unique IV and Auth Tag.
|
|
29
|
+
- ✅ **Nested Components support** at any depth.
|
|
30
|
+
|
|
31
|
+
### Installation
|
|
33
32
|
|
|
34
33
|
```bash
|
|
34
|
+
npm install @growy/strapi-plugin-encrypted-field
|
|
35
|
+
# or
|
|
35
36
|
yarn add @growy/strapi-plugin-encrypted-field
|
|
36
37
|
```
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
### Configuration
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
#### 1. Enable the plugin
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
Create or edit `config/plugins.js` or `config/plugins.ts`:
|
|
43
44
|
|
|
44
45
|
```javascript
|
|
45
46
|
module.exports = {
|
|
@@ -49,199 +50,111 @@ module.exports = {
|
|
|
49
50
|
};
|
|
50
51
|
```
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
#### 2. Configure Encryption Key (REQUIRED)
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
Agrega a tu `.env`:
|
|
55
|
+
Add to your `.env`:
|
|
57
56
|
|
|
58
57
|
```bash
|
|
59
|
-
ENCRYPTION_KEY=
|
|
58
|
+
ENCRYPTION_KEY=your_64_character_hex_key_here
|
|
60
59
|
```
|
|
61
60
|
|
|
62
|
-
|
|
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
|
-
|
|
61
|
+
Generate a secure key:
|
|
79
62
|
```bash
|
|
80
63
|
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
|
|
81
64
|
```
|
|
82
65
|
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
91
|
-
|
|
92
|
-
### 3. Rebuild del admin
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
npm run build
|
|
96
|
-
npm run develop
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Requisitos
|
|
100
|
-
|
|
101
|
-
- **Strapi**: v5.0.0 o superior
|
|
102
|
-
- **Node.js**: 18.x - 22.x
|
|
103
|
-
- **npm**: 6.0.0 o superior
|
|
104
|
-
|
|
105
|
-
## Validación de datos
|
|
66
|
+
### Usage
|
|
106
67
|
|
|
107
|
-
|
|
68
|
+
1. Go to **Content-Type Builder**.
|
|
69
|
+
2. Select a collection or create a new one.
|
|
70
|
+
3. Click on **"Add another field"**.
|
|
71
|
+
4. Select **"Encrypted Text"** (look for the 🔒 icon).
|
|
72
|
+
5. Values are hidden by default in the Admin Panel but can be revealed or copied using the inline buttons.
|
|
108
73
|
|
|
109
|
-
|
|
110
|
-
|
|
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
|
|
115
|
-
|
|
116
|
-
**Ejemplo**: Para validar formato de API key:
|
|
117
|
-
```regex
|
|
118
|
-
^sk-[a-zA-Z0-9]{32}$
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
Si el valor no cumple con el patrón, se lanzará un error antes de cifrar.
|
|
122
|
-
|
|
123
|
-
## Uso
|
|
124
|
-
|
|
125
|
-
### 1. Agregar campo cifrado a una colección
|
|
74
|
+
---
|
|
126
75
|
|
|
127
|
-
|
|
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
|
|
76
|
+
## Versión en Español
|
|
133
77
|
|
|
134
|
-
|
|
78
|
+
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.
|
|
135
79
|
|
|
136
|
-
|
|
80
|
+
### Características
|
|
137
81
|
|
|
138
|
-
- **
|
|
139
|
-
- **
|
|
140
|
-
- **
|
|
141
|
-
- **
|
|
142
|
-
- **
|
|
143
|
-
- **
|
|
144
|
-
- **
|
|
145
|
-
- **
|
|
146
|
-
- **
|
|
82
|
+
- ✅ **Campo personalizado** "Texto Cifrado" en el Content-Type Builder.
|
|
83
|
+
- ✅ **Cifrado automático** AES-256-GCM al guardar.
|
|
84
|
+
- ✅ **Descifrado transparente** al leer (panel y API).
|
|
85
|
+
- ✅ **Validación backend** con soporte para regex y restricciones.
|
|
86
|
+
- ✅ **UI Nativa Strapi v5** con controles de visibilidad y copiar al portapapeles.
|
|
87
|
+
- ✅ **Soporte multi-idioma (i18n)**: Inglés y Español.
|
|
88
|
+
- ✅ **Gestión de claves robusta** con validación y mensajes de error claros.
|
|
89
|
+
- ✅ **Datos cifrados** en base de datos con IV único y Auth Tag.
|
|
90
|
+
- ✅ **Soporte para componentes anidados** a cualquier profundidad.
|
|
147
91
|
|
|
148
|
-
###
|
|
92
|
+
### Instalación
|
|
149
93
|
|
|
150
94
|
```bash
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
-d '{
|
|
155
|
-
"data": {
|
|
156
|
-
"nombre": "Juan",
|
|
157
|
-
"apiKey": "mi-clave-secreta-123"
|
|
158
|
-
}
|
|
159
|
-
}'
|
|
160
|
-
|
|
161
|
-
# Leer (devuelve descifrado)
|
|
162
|
-
curl -X GET http://localhost:1337/api/usuarios/1
|
|
163
|
-
# Response: { "nombre": "Juan", "apiKey": "mi-clave-secreta-123" }
|
|
95
|
+
npm install @growy/strapi-plugin-encrypted-field
|
|
96
|
+
# o
|
|
97
|
+
yarn add @growy/strapi-plugin-encrypted-field
|
|
164
98
|
```
|
|
165
99
|
|
|
166
|
-
|
|
100
|
+
### Configuración
|
|
167
101
|
|
|
168
|
-
|
|
102
|
+
#### 1. Habilitar el plugin
|
|
169
103
|
|
|
170
|
-
|
|
171
|
-
```json
|
|
172
|
-
{
|
|
173
|
-
"nombre": "string",
|
|
174
|
-
"email": "email",
|
|
175
|
-
"apiKey": "plugin::encrypted-field.encrypted-text"
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
**En la BD:**
|
|
180
|
-
```
|
|
181
|
-
apiKey: "a1b2c3d4e5f6....:f9e8d7c6b5a4....:9f8e7d6c5b4a3..."
|
|
182
|
-
```
|
|
104
|
+
Edita `config/plugins.js`:
|
|
183
105
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
106
|
+
```javascript
|
|
107
|
+
module.exports = {
|
|
108
|
+
'encrypted-field': {
|
|
109
|
+
enabled: true,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
187
112
|
```
|
|
188
113
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
### Especificaciones técnicas
|
|
114
|
+
#### 2. Configurar la clave (REQUERIDO)
|
|
192
115
|
|
|
193
|
-
|
|
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)
|
|
116
|
+
Agrega a tu `.env`:
|
|
198
117
|
|
|
199
|
-
|
|
118
|
+
```bash
|
|
119
|
+
ENCRYPTION_KEY=tu_clave_de_64_caracteres_hexadecimales_aqui
|
|
120
|
+
```
|
|
200
121
|
|
|
201
|
-
|
|
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
|
|
122
|
+
### Uso
|
|
206
123
|
|
|
207
|
-
|
|
124
|
+
1. Ve a **Content-Type Builder**.
|
|
125
|
+
2. Selecciona una colección.
|
|
126
|
+
3. Click en **"Add another field"**.
|
|
127
|
+
4. Selecciona **"Texto Cifrado"** (icono 🔒).
|
|
128
|
+
5. Los valores están ocultos por defecto en el panel pero pueden mostrarse o copiarse con los botones integrados.
|
|
208
129
|
|
|
209
|
-
|
|
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
|
|
130
|
+
### Seguridad y Especificaciones
|
|
214
131
|
|
|
215
|
-
|
|
132
|
+
- **Algoritmo**: AES-256-GCM.
|
|
133
|
+
- **IV (Initialization Vector)**: 96 bits generado aleatoriamente por operación.
|
|
134
|
+
- **Auth Tag**: 128 bits para verificación de integridad.
|
|
135
|
+
- **Formato almacenado**: `iv:authTag:encryptedData`.
|
|
216
136
|
|
|
217
|
-
|
|
218
|
-
- 🔐 Tokens de acceso
|
|
219
|
-
- 🔒 Secretos de webhooks
|
|
220
|
-
- 💳 Información sensible
|
|
221
|
-
- 📧 Credenciales SMTP
|
|
222
|
-
- 🔑 Contraseñas de aplicaciones
|
|
137
|
+
### Limitaciones
|
|
223
138
|
|
|
224
|
-
|
|
139
|
+
- ❌ **Búsqueda**: No se puede buscar por campos cifrados.
|
|
140
|
+
- ❌ **Ordenamiento**: No se puede ordenar por campos cifrados.
|
|
141
|
+
- ❌ **Filtros**: No se pueden aplicar filtros directos sobre datos cifrados.
|
|
225
142
|
|
|
226
|
-
|
|
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
|
|
143
|
+
---
|
|
231
144
|
|
|
232
|
-
## Licencia
|
|
145
|
+
## License / Licencia
|
|
233
146
|
|
|
234
147
|
MIT © 2025 Growy AI
|
|
235
148
|
|
|
236
|
-
##
|
|
149
|
+
## Credits / Créditos
|
|
237
150
|
|
|
238
151
|
**Growy AI** - Soluciones de IA y automatización empresarial
|
|
239
152
|
|
|
240
|
-
**Autor principal**: Zahir El isaac
|
|
153
|
+
**Main Author / Autor principal**: Zahir El isaac
|
|
241
154
|
|
|
242
155
|
---
|
|
243
156
|
|
|
244
157
|
<div align="center">
|
|
245
|
-
<p>Si este plugin te resulta útil, considera darle una ⭐ en GitHub</p>
|
|
246
|
-
<p>
|
|
158
|
+
<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>
|
|
159
|
+
<p>Made with ❤️ by Growy AI Team</p>
|
|
247
160
|
</div>
|