首页 > 解决方案 > Angular 6 中是否有任何加密机制可以每次都提供相同的加密输出?

问题描述

我正在尝试使用他的手机号码注册客户。我将手机号码存储为加密的手机号码,并且我正在维护一个会话来存储这个加密的手机号码。一旦我退出应用程序并尝试使用相同的手机号码登录,我的会话就会关闭。所以我无法从会话中获取加密的手机号码。

有什么方法可以创建加密机制,每次为同一个手机号码提供相同的加密输出?

这是我正在使用的加密机制。

public encrypt_mobile(mobile): Observable<any> {
  var salt = crypto.lib.WordArray.random(128 / 8);
  var key = crypto.PBKDF2("123", salt, {
    256: 256 / 32,
    100: 100
  });
  var iv = crypto.lib.WordArray.random(128 / 8);
  var encrypted = crypto.AES.encrypt(mobile, key, {  
    // instead of message try some string or  “9876543210”
    iv: iv,
    padding: crypto.pad.Pkcs7,
    mode: crypto.mode.CBC
  });
  var encrypted_mob = salt.toString() + iv.toString() + 
    encrypted.toString();
  console.log("encrypted : ", encrypted_mob);
  return encrypted_mob;
}

标签: sessionencryptionangular6public-key-encryption

解决方案


您正在使用随机 IV的CBC模式。

mode: crypto.mode.CBC

实际上,这更好,因为它是概率加密。但是 CBC 模式会阻止对加密数据进行比较。

您应该使用 ECB 操作模式来实现对加密数据的相等性测试而无需解密。

mode: CryptoJS.mode.ECB

ECB 模式不使用/不需要 IV。但是,请记住 ECB 模式会泄露信息,请参阅 Wikipedia 中的企鹅


推荐阅读