【问题标题】:How to Encrypt and Decrypt in Angular 6如何在 Angular 6 中加密和解密
【发布时间】:2021-12-16 17:50:08
【问题描述】:

登录响应

{ 代码:200, 编号:4, 味精:“成功”, 用户:“苏拉夫” }

我有一个问题,例如我想将 id 和用户以加密格式存储在本地存储中。我该如何使用 Angular 6 来做到这一点?

【问题讨论】:

  • 使用npm install crypto-js

标签: javascript angular


【解决方案1】:

在我们的一个项目中,我们使用了“crypto-js”库。 http://github.com/brix/crypto-js

import * as CryptoJS from 'crypto-js';

encryptData(data) {

    try {
      return CryptoJS.AES.encrypt(JSON.stringify(data), this.encryptSecretKey).toString();
    } catch (e) {
      console.log(e);
    }
  }

  decryptData(data) {

    try {
      const bytes = CryptoJS.AES.decrypt(data, this.encryptSecretKey);
      if (bytes.toString()) {
        return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
      }
      return data;
    } catch (e) {
      console.log(e);
    }
  }

【讨论】:

  • this.encryptSecretKey应该如何保存?
  • @KumarSidharth - 您将需要某种通过后端提供的身份验证系统。登录时,在同一请求中提供带有用户信息的加密密钥。
  • @CodyTolene 密钥是静态字符串。那么从服务器获取它有什么意义呢?我们可以使用代码本身的一个键。
【解决方案2】:

在客户端加密事物的技术解决方案可能是使用一些第三方库。引用此类库会导致固执己见的答案,这在这里不是很可取。

但是,如果用例是对用户隐藏一些后端数据(当我阅读您的问题时似乎就是这种情况),加密没有意义,因为密钥将存储在 JavaScript 代码中或通过网络发送。在这两种情况下都无法混淆。

客户端加密的一些有效用例示例:

  • 允许用户使用他们拥有的密钥对事物进行加密。
  • 使用一些公钥为拥有相应私钥的系统加密消息
  • ...

【讨论】:

  • 用户可以在本地输入一个记忆的密钥,无需通过网络传输。这个经常用吗?不,但它是一个极端偏执的网络编程用例。
  • 用例可能类似于:用户想要使用本地浏览器加密实用程序加密本地文件。然后将结果存储在本地。我绝对同意,对于通常的加密用例,以及大多数网络程序员将它用于“我想加密以实现安全的本地存储”或“我想确保用户看不到一些特殊的东西”存储在本地”...这不起作用。然而,有一些奇怪的用例可以使用它,所以“在客户端加密东西没有意义”这句话不是 100% 准确的。
【解决方案3】:

虽然不完美,window.btoa() 会提供基本的base-64 编码,避免大家读取用户数据。这可能是您最快的解决方案。由于客户端的加密不安全,因为最终用户可以看到浏览器的所有内容(您的代码或 Ajax 调用等),甚至您的加密密钥。

【讨论】:

    【解决方案4】:

    您可以使用crypto.js 来加密数据。如果您不知道如何在 Angular 中使用它,请参阅 this

    接下来,您将加密数据放入本地存储。看到这个tutorial

    【讨论】:

      【解决方案5】:

      您也可以使用secure-ls。无需在客户端维护解密密钥。

      import * as SecureLS from 'secure-ls';
      export class StorageService { 
      
        private _ls = new SecureLS({ encodingType: 'aes' });
        constructor() {
        }
      
        set(key: string, value: any, expired: number = 0) {
          this._ls.set(key, value);
        }
      
        remove(key: string) {
          this._ls.remove(key);
        }
      
        get(key: string) {
          return this._ls.get(key);
        }
      
        clear() {
          this._ls.removeAll();
        }
      }
      

      【讨论】:

        【解决方案6】:

        直接使用内置函数如下:

        const encodedData = btoa('Hello, world'); // encode a string        
        localStorage.setItem("token", encodedData );
        
        let accessToken = localStorage.getItem("token");
        const decodedData = atob(accessToken ); // decode the string
        

        【讨论】:

        • 这不是加密解密
        【解决方案7】:

        这就是我在 Angular 中进行加密/解密的方式:

        //profile-detail.component.ts

        var userIdVal = this._AESEncryptDecryptService.get(this.Auth[0].UserID);
            this._AESEncryptDecryptService.encryptData(this.eCode);
            var UserIdEncrpt = this._AESEncryptDecryptService.encryptData(userIdVal);

        //EncryptDecryptService.service.ts

        export class AESEncryptDecryptServiceService {
          secretKey = 'YourSecretKeyForEncryption&Descryption'
          constructor() { }
        
          // QA/UAT secret key
          encryptSecretKey = 'mySecretKeyHere'
          tokenFromUI: string = '123456$#@$^@1ERF'
          // Prod secret key
          // encryptSecretKey = 'b14ca3428a4e1840bbce2ea2315a1814'
          // tokenFromUI: string = '7891@$#@$^@1@ERF'
        
          // 7891@230456$#@$^@1257@ERF
        
          //adding secret key
        
          //Data Encryption Function
          encryptData(msg) {
        
            var keySize = 256
            var salt = crypto.lib.WordArray.random(16)
            var key = crypto.PBKDF2(this.encryptSecretKey, salt, {
              keySize: keySize / 32,
              iterations: 100,
            })
        
            var iv = crypto.lib.WordArray.random(128 / 8)
        
            var encrypted = crypto.AES.encrypt(msg, key, {
              iv: iv,
              padding: crypto.pad.Pkcs7,
              mode: crypto.mode.CBC,
            })
        
            var result = crypto.enc.Base64.stringify(
              salt.concat(iv).concat(encrypted.ciphertext)
            )
            return result
          }
        
          decryptData(txt) {
            var key = crypto.enc.Base64.parse(this.encryptSecretKey)
            var iv = crypto.lib.WordArray.create([0x00, 0x00, 0x00, 0x00])
            var decrypted = crypto.AES.decrypt(txt, key, { iv: iv })
            return decrypted.toString(crypto.enc.Utf8)
          }
        
          // ========================================================
        
          encrypted: any = ''
          decrypted: string
        
          set(value) {
            var key = crypto.enc.Utf8.parse(this.tokenFromUI)
            var iv = crypto.enc.Utf8.parse(this.tokenFromUI)
            var encrypted = crypto.AES.encrypt(
              crypto.enc.Utf8.parse(value.toString()),
              key,
              {
                keySize: 128 / 8,
                iv: iv,
                mode: crypto.mode.CBC,
                padding: crypto.pad.Pkcs7,
              }
            )
        
            return encrypted.toString()
          }
        
          //The get method is use for decrypt the value.
          get(value) {
            var key = crypto.enc.Utf8.parse(this.tokenFromUI)
            var iv = crypto.enc.Utf8.parse(this.tokenFromUI)
            var decrypted = crypto.AES.decrypt(value, key, {
              keySize: 128 / 8,
              iv: iv,
              mode: crypto.mode.CBC,
              padding: crypto.pad.Pkcs7,
            })
        
            return decrypted.toString(crypto.enc.Utf8)
          }
        
          decryptUsingAES256(value) {
            let _key = crypto.enc.Utf8.parse(this.tokenFromUI)
            let _iv = crypto.enc.Utf8.parse(this.tokenFromUI)
        
            var decrpted = crypto.AES.decrypt(value, _key, {
              keySize: 128 / 8,
              iv: _iv,
              mode: crypto.mode.CBC,
              padding: crypto.pad.Pkcs7,
            }).toString(crypto.enc.Utf8)
        
            return decrpted
          }
        
          
        
           
        }`

        【讨论】:

          猜你喜欢
          • 2020-12-21
          • 2023-01-31
          • 1970-01-01
          • 1970-01-01
          • 2015-05-04
          • 2016-06-12
          • 2011-05-15
          • 1970-01-01
          相关资源
          最近更新 更多