错误类型错误:无法读取 null 的属性“盐”

时间:2021-07-20 17:22:18

标签: javascript angular typescript

我在尝试加密和解密本地和会话存储的值时遇到问题。

感谢您的时间和帮助。

enter image description here

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);
    }
  }
}

我需要加密本地和会话存储的值,并在必要时解密。

我不知道失败在哪里。

哪种方式最容易实现加密?

1 个答案:

答案 0 :(得分:1)

该错误信息量不大,但基本上,当使用 crypto-js 解密一个值时,它有一个步骤是将字符串输入转换为包含例如盐。如果您将非字符串传递给解密函数,则 crypto-js 假定它已经是这样的对象。因此,如果您传递 null,它稍后将尝试访问 (null).salt 并出错。

这基本上意味着您的 getItem 正在尝试读取不在存储中的值。添加适当的空检查。例如。如果您尝试访问 null 的值,请立即返回该值,而不要尝试对其进行解密。