javascript - FEL TypeError: Kan inte läsa egenskapen 'salt' av null


Jag har problem med att försöka kryptera och dekryptera värdena i lokal lagring och sessionslagring.

Tack för din tid och din hjälp.

import { Injectable } from "@angular/core";
import { environment } from "../../../environments/environment";
import * as CryptoJS from 'crypto-js';



@Injectable({
  providedIn: "root"
})
export class StorageService {
  constructor() {}

  // If the logged in user details are stored in local storage the user will stay logged in if they refresh
  // the browser and also between browser sessions until they logout

  // Para cambiar el tipo de storage a utilizar modificar el valor en el archivo de enviorment correspondiente
  // los valores posibles son LOCALSTORAGE o SESSIONSTORAGE

  encryptation(value: string, llave: string) {
    return CryptoJS.AES.encrypt(value, llave);
  }

  decrypt(value: string, llave: string) {
    return CryptoJS.AES.decrypt(value, llave);
  }

  llave: string = "prueba";

  setItem(key: string, value: string): void {
    value = this.encryptation(value, this.llave);
    if (environment.storage === "SESSIONSTORAGE") {
      console.log(key,value);
      sessionStorage.setItem(key, value);
    } else {
      console.log(key,value);
      localStorage.setItem(key, value);
    }
  }

  getItem(key: string): string {
    let value;
    let value1 = sessionStorage.getItem(key);
    let value2 = localStorage.getItem(key);
    if (environment.storage === "SESSIONSTORAGE") {
      value = this.decrypt(value1, this.llave);
      console.log(value);
      return value;
    } else {
      value = this.decrypt(value2, this.llave);
      console.log(value);
      return value;
    }
  }

  key(index: number): string {
    if (environment.storage === "SESSIONSTORAGE") {
      return sessionStorage.key(index);
    } else {
      return localStorage.key(index);
    }
  }

  removeItem(key: string): void {
    if (environment.storage === "SESSIONSTORAGE") {
      sessionStorage.removeItem(key);
    } else {
      localStorage.removeItem(key);
    }
  }
}

Jag behöver kryptera värdena i lokal- och sessionslagring, och dekryptera när det är nödvändigt.

Jag vet inte var felet är.

Vilket är det enklaste sättet att uppnå krypteringen?

Svar #1

Felet är inte särskilt informativt, men i princip, när man dekrypterar ett värde med crypto-js, finns det ett steg där det omvandlar stränginmatningar till ett "krypterat objekt" som innehåller t.ex. saltet. Om du skickar något som inte är en sträng till decrypt-funktionen, antar crypto-js att det redan är ett sådant objekt. Därför, om du skickar null, kommer det senare att försöka komma åt (null).salt och ge ett fel.

Detta betyder i princip att din getItem försöker läsa ett värde som inte finns i lagringen. Lägg till korrekta null-kontroller. T.ex. om du försöker komma åt ett värde som är null, returnera det omedelbart utan att försöka dekryptera det.

Relaterade artiklar