Angular: Cifrar localStorage
Crear una aplicación web implica persistir datos de manera rápida. Eso lo podemos hacer gracias a localStorage, y, su implementación puede ser diferente para cada caso. Hoy veremos como usarlo de manera segura y efectiva.
Tabla de contenido
Configuración del proyecto
Para éste ejemplo usaremos un componente y un servicio.
Archivo | Tipo | Descripcion |
---|---|---|
home | Component | Vista principal, tendrá los datos que se cifrarán |
secure-storage | Service | Lógica para nuestro localStorage seguro |
También instalaremos dos librerías adicionales.
Libreria | Descripcion |
---|---|
secure-ls | Cifra y comprime datos de alto nivel para localStorage |
@intmainreturn/randomizer | Genera códigos aleatorios (Opcional) |
En un nuevo proyecto creamos los archivos e instalamos las dependencias que necesitamos.
$ ng generate component view/home
$ ng generate service services/secure-storage
$ npm install secure-ls --save
$ npm install @intmainreturn/randomizer --save
Creación de componentes
Esto será un ejemplo práctico y sencillo, así que modificamos lo siguiente.
home.component.ts
import { Component, OnInit } from '@angular/core';
import * as randomizer from '@intmainreturn/randomizer';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
public serialActivation: string;
ngOnInit(): void {
const SERIAL_ACTIVATION = randomizer.serial();
localStorage.setItem('serialActivation', SERIAL_ACTIVATION);
this.serialActivation = localStorage.getItem('serialActivation');
}
}
home.component.html
<p>Serial de activacion: {{serialActivation}}</p>
Veamos como queda nuestra vista. Claro, aún es inseguro y seguimos expuestos.
Seguridad a localStorage
Abre el archivo secure-storage.service.ts
y agrega lo siguiente.
import { Injectable } from '@angular/core';
import * as SecureLS from 'secure-ls';
@Injectable({
providedIn: 'root'
})
export class SecureStorageService {
private secureLs: any = new SecureLS({
encodingType: 'rc4',
isCompression: false,
encryptionSecret: 'Mys3cr3tPa$$w0rd@321'
});
public getItem(item: string): string{
return this.secureLs.get(item);
}
public setItem(key: string, data): void{
this.secureLs.set(key, data);
}
}
Asegúrate de personalizar la opción encryptionSecret con caracteres especiales y de larga longitud para una mayor seguridad y dificultad.
Para usar este servicio lo agregamos en el constructor del archivo home.component.ts y cambiamos algunas cosas más. Quedaría de la siguiente manera.
import { Component, OnInit } from '@angular/core';
import * as randomizer from '@intmainreturn/randomizer';
import {SecureStorageService} from '../../services/secure-storage.service';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
public serialActivation: string;
constructor(private storageService: SecureStorageService) {}
ngOnInit(): void {
const SERIAL_ACTIVATION = randomizer.serial();
this.storageService.setItem('serialActivation', SERIAL_ACTIVATION);
this.serialActivation = this.storageService.getItem('serialActivation');
}
}
Veamos en nuestro navegador el resultado.
Vaya! Hemos aplicado seguridad en nuestro localStorage.
En el siguiente post les enseñaré un tip para reforzar la seguridad y aplicar medidas más avanzadas para localStorage.
Saludos y bendiciones.