自定义安全存储提供程序Ionic v3-使用CryptoJS

时间:2018-11-28 12:00:31

标签: javascript angular ionic3 es6-promise

如何使用此提供程序?我为我的应用程序编写了一个缓存服务,如下所示。

cache-service.ts

import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
import { SecureStorageProvider } from '../secure-storage/secure- 
storage';

@Injectable()
export class CacheServiceProvider {

    constructor(
    private secureStorage:SecureStorageProvider,
    ) {

    }

    getCache(key: string) {
    return new Promise((resolve, reject) => {
      this.secureStorage.get(key).then((val) => {
        console.error(key,"Value is found......", val);
        if (val != undefined) {
          if(val===false){
            return false;
          }else{
          resolve(val);
          }
        } else {
          reject({'msg':'value not found'});
        }
      });
     })
    }

    setCache(key: string, value: any) {
      this.secureStorage.set(key,value);
    }

    removeCache(key: string) {
      this.secureStorage.remove(key);
    }

    clearCache() {
      this.secureStorage.clear();
    }
}

secure-storage.ts:

import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
import CryptoJS from 'crypto-js';

@Injectable()
export class SecureStorageProvider {

    secret: string = '';
    localData: Object = {};
    storekey: string = "secretdata";

    constructor(
        private storage: Storage
    ) { }

    initStorage(secret) {
        this.secret = secret;
       return this.storage.ready()
           .then(() =>
              { return this.storage.get(this.storekey)
                   .then(data => {

                        this.localData={};
                        console.log("THIS IS WHERE IT ALL BEGINS",secret);
                        if (data != null) {
                           this.localData = this.decrypt(data, 
    this.secret);
                           return true
                       } else return false
                   })})
    }

    encrypt(data, key) {
       return CryptoJS.AES.encrypt(JSON.stringify(data), key).toString();
    }

    decrypt(data, key) {
       let bytes = CryptoJS.AES.decrypt(data, key);
       return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
    }

    setOnly(key, data) {
       this.localData[key] = data;
       return Promise.resolve(true);
    }

    get(key) {
       if (this.localData[key])
           return Promise.resolve(this.localData[key])
       else return Promise.resolve(null);
    }

    changeSecret(newsecret) {
       this.secret = newsecret;
       return this.storage.ready()
           .then(() => {
               return this.storage.set(this.storekey,
                   this.encrypt(this.localData ? this.localData : '', 
    this.secret));
           })
    }

    set(key, data) {
       this.setOnly(key, data);

       return this.storage.ready()
           .then(() => {
               return this.storage.set(this.storekey,
                   this.encrypt(this.localData ? this.localData : '', 
    this.secret));
           })
    }

    remove(key:any){

       if (this.localData[key]){
           delete this.localData[key]; 
           this.storage.set(this.storekey,
           this.encrypt(this.localData ? this.localData : '', 
    this.secret));
           return Promise.resolve(this.localData[key]);
       }else{
           return Promise.resolve(null);
       }
    }

    clear()
    {
        this.storage.clear();
    }
}

以上代码在Android上工作正常,但在iOS中工作不正常。

对于Android,它可以正常工作,并且我们为每个设置的键获取价值。但是对于iOS,我无法调试为何不起作用。我已经尝试过模拟器以及设备。它设置值,但从不读取它。

0 个答案:

没有答案