@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.
- package/README.md +109 -170
- 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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
53
|
+
ENCRYPTION_KEY=your_64_character_hex_key_here
|
|
60
54
|
```
|
|
61
55
|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
89
|
+
---
|
|
100
90
|
|
|
101
|
-
|
|
102
|
-
- **Node.js**: 18.x - 22.x
|
|
103
|
-
- **npm**: 6.0.0 o superior
|
|
91
|
+
## Versión en Español
|
|
104
92
|
|
|
105
|
-
|
|
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
|
-
|
|
95
|
+
### Características
|
|
108
96
|
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
## Uso
|
|
114
|
+
### Configuración
|
|
124
115
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: { "
|
|
156
|
+
# Response: { "apiKey": "mi-clave-secreta-123" }
|
|
164
157
|
```
|
|
165
158
|
|
|
166
|
-
|
|
159
|
+
### Especificaciones Técnicas
|
|
167
160
|
|
|
168
|
-
|
|
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
|
-
|
|
171
|
-
```json
|
|
172
|
-
{
|
|
173
|
-
"nombre": "string",
|
|
174
|
-
"email": "email",
|
|
175
|
-
"apiKey": "plugin::encrypted-field.encrypted-text"
|
|
176
|
-
}
|
|
177
|
-
```
|
|
166
|
+
### Limitaciones Conocidas
|
|
178
167
|
|
|
179
|
-
**
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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>
|
|
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>
|