core.js:478 未捕获错误:在 Angular 中解密 URL 查询参数时格式错误的 UTF-8 数据

问题描述 投票:0回答:1

我在下面有一个加密和解密服务,我在整个应用程序中使用它来加密和解密本地存储项目。虽然它对于本地存储项目工作得很好,但当我尝试解密通过 queryparams 发送的加密对象时,我收到以下错误:

core.js:478 Uncaught Error: Malformed UTF-8 data

我的加密/解密服务是:

export class AESEncryptDecryptService {
    
      secretKey = 'My secret string';
      constructor() { }
    
      encrypt(value? : string) : string{
        if(!isNil(value)) {
          return CryptoJS.AES.encrypt(value, this.secretKey.trim()).toString();
        }
      }
    
      decrypt(textToDecrypt?){
        if(!isNil(textToDecrypt)) {
        return CryptoJS.AES.decrypt(textToDecrypt, this.secretKey.trim()).toString(CryptoJS.enc.Utf8);
        }
      }
}

在发送对象之前如何对其进行加密:

const user= new User();
this.qrUrl =  `${environment.someurl}` +'currentUser=' +this._AESEncryptDecryptService.encrypt(JSON.stringify(user).toString()).toString();

我如何解密对象: const url_string = window.location.href; const url = 新 URL(url_string);

if(url.searchParams.get('user')) {
  this.qrDevice = JSON.parse(this._AESEncryptDecryptService.decrypt(url.searchParams.get('user')));
}

我在没有字符串的情况下通过调试进行了尝试。相同的代码适用于其他用途,但在 url 查询解密时出现此错误。

我注意到的一件事是查询字符串将字符串中的 + 替换为空格。我该如何解决这个问题并保留+号?下面发布了加密对象的预期和实际。

从 URL 解析对象后预期:

U2FsdGVkX1+8y4FZ0cDq5ikapUndRA+tE5BAVqYPH9NnhBWeea1asYo5zCU80s/6FWKnFU8FghXv7JxPWwnPpJtCR+exIGpiGBWq4gpq00PoeIuU2jPsDeifSu8aDrFr+D8abcdkIil5WmsHiND 5TwVfWHhaBDSSlyMSXbiUXx9DQgRipEATXXgMEO/r7G5wpuJ9ekEzUfkgXIO3eM/tP6dMu2iWZwbXTDvBZl93J8XZ259YRTIkRXgolSGS2t9yvQOn9I7fobRI1NSCIAftQtGdj/k9pu4B9reicnw9wiNR4dmp8 +cpI/3TQSevhwp

从 url 解析对象后的实际值:

U2FsdGVkX1 8y4FZ0cDq5ikapUndRA tE5BAVqYPH9NnhBWeea1asYo5zCU80s/6FWKnFU8FghXv7JxPWwnPpJtCR exXIGpiGBWq4gpq00PoeIuU2jPsDeifSu8aDrFr D8abcdkIil5WmsHiND5TwVfWHhaBDSSlYMSXbiUXx9DQgRipEatXXgMEO/r7G5wpuJ9ekEzUfkgXIO3eM/tP6dMu2iWZwbXTDvBZl93J8XZ259YRtIkRXgolSGS2t9yvQOn9I7fobRI1NSCIAftQtGdj/k9pu4 B9reicnw9wiNR4dmp8 CPI/3TQSevhwp

angular encryption query-string cryptojs
1个回答
1
投票

通过将 qrurl 更改为以下内容解决了问题:

 this.qrUrl =  `${environment.qrOrderURL}user=`+encodeURIComponent(this._AESEncryptDecryptService.encrypt(JSON.stringify(user)));
© www.soinside.com 2019 - 2024. All rights reserved.