Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 我需要一个替代初始化向量加密的方法_Encryption - Fatal编程技术网

Encryption 我需要一个替代初始化向量加密的方法

Encryption 我需要一个替代初始化向量加密的方法,encryption,Encryption,我帮助一家小型非营利组织建立了一条很酷的“匿名”帮助热线,在那里,他们的客户可以向电话号码发送短信问题,而组织可以在不知道客户是谁的情况下做出回应。事实证明,它是对组织非常有用的工具。我正在从头开始重新编写它,并寻求如何处理匿名方面的建议 v1的工作方式是简单地加密/解密客户端电话号码,并使用“aes-256-ctr”在数据模型中将其用作客户端id。由于非营利组织的工作人员/领导层无权访问加密密钥,他们可以合法地声称无法访问其客户未自愿披露的任何p.i.i。当他们向客户端发出消息响应时,我只需解

我帮助一家小型非营利组织建立了一条很酷的“匿名”帮助热线,在那里,他们的客户可以向电话号码发送短信问题,而组织可以在不知道客户是谁的情况下做出回应。事实证明,它是对组织非常有用的工具。我正在从头开始重新编写它,并寻求如何处理匿名方面的建议

v1的工作方式是简单地加密/解密客户端电话号码,并使用“aes-256-ctr”在数据模型中将其用作客户端id。由于非营利组织的工作人员/领导层无权访问加密密钥,他们可以合法地声称无法访问其客户未自愿披露的任何p.i.i。当他们向客户端发出消息响应时,我只需解密客户端id即可获得发送消息所需的电话

v1加密策略:

export const encrypt = (text) => {
  const cipher = crypto.createCipher(algorithm, password);
  let crypted = cipher.update(text, 'utf8', 'hex');
  crypted += cipher.final('hex');
  return crypted;
};

export const decrypt = (text) => {
  const decipher = crypto.createDecipher(algorithm, password);
  let dec = decipher.update(text, 'hex', 'utf8');
  dec += decipher.final('utf8');
  return dec;
};
不过,最近我收到了控制台警告,因为新的节点版本在使用CreateChipher而不是CreateChipheriv来利用初始化向量时会输出警告。在重写v2时,我将其切换到createCipheriv,但这会“随机”加密输出,并破坏我将加密电话号码作为可靠、一致的客户端id的能力。能够可靠地对客户端消息进行分组是在UX中提供对话视图的重要要求

我如何正确地加密识别电话号码,以便只有我才能在消息发送时解密它,并且仍然具有某种一致的内部ID来分组消息?我不必依赖加密的电话号码作为客户id,但我想不出任何可靠的替代方案(通过某种查找表)。如果可能的话,如果不是最佳实践,我不想在没有I.V.的情况下依赖CreateChipher

我应该注意,此应用程序不处理任何法律敏感信息或任何类似的高风险信息。我可能可以将未加密的电话号码存储在数据库中,而不将其暴露在前端并保持匿名,如果有合理的解决办法,我真的不喜欢这种想法


有什么想法吗?

您应该为每个新客户端生成一个新的随机(或UUID样式)客户端id。这样做的好处是,您可以继续使用安全的加密方法,并且仍然可以快速识别和查找用户

如果希望电话号码字段充当唯一的查找,只需获取电话号码的HMAC,并将其用于查找(以及存储加密)-它永远无法解密,并且保证在给定密钥下对同一电话号码的调用之间保持一致


编辑:要迁移现有数据,您应该为每个记录获取客户端id(当前是加密的电话号码),解密它,HMAC它,并将结果存储在新列中。然后,生成一个新的ID并将其设置为客户端ID。这允许按实际客户端ID和电话号码进行查找。

>“您应该为每个新客户端生成一个新的随机(或UUID样式)客户端ID。”我非常喜欢这样,但我无法确定如何链接到以前创建的客户端记录。也许我把HMAC当作查找键?所以客户机表是ID=uuidv4(),HMAC是第二列,所以我只是在客户机表中搜索匹配的HMAC来发现uuid。我会接受你的回答。非常感谢。快速跟进。。节点的HMAC策略是否有任何特定建议?以下各项可以吗?const hmac=crypto.createHmac('sha256','a secret');是的,那太完美了。我可能会使用256位的CSPRNG输出作为秘密,并将其存储在一个平面文件中。非常感谢。作为一个例子,“一个秘密”直接来自加密文档。我更喜欢我的加密密钥像这个推荐列表中的任何东西一样更安全:(开玩笑)