基于字符串(或uuid)生成人类可区分的图片

Mih*_*lpo 5 javascript encryption avatar man-in-the-middle avatar-generation

Tl;Dr:我正在创建一个应用程序:两个或多个用户之间的端到端加密聊天,并且需要快速便捷的方式来直观地检查是否存在中间人

应用程序背后的想法:

  1. AliceBob前端应用程序生成 RSA公钥+私钥(使用很棒的jsencrypt库)
  2. AliceBob前端应用程序向服务器应用程序发送请求,因此服务器为Alice和Bob生成唯一的ID(实际上是UUID)。
  3. AliceBob前端应用程序生成链接QR 代码,在 url 的哈希部分中包含他们的公钥和 ID,因此在打开时不会将其发送到服务器。
  4. 链接二维码的照片可以通过第三方渠道(不受保护)发送,并且打开允许 ​​Alice 和 Bob 前端应用程序将其对应项添加到“联系人列表”(所有这些都发生在前端) )
  5. Alice的应用程序从Bob的应用程序接收到公钥和ID后,用公钥加密消息并将其发送到服务器,并指定Bob的ID
  6. Bob询问服务器“我的ID有新消息吗?”,收到服务器发来的消息后,用他的私钥解密。
  7. 服务器在任何时候都没有获取私钥或公钥。它只是生成 ID 并在由 javascript 前端加密的 ID 之间传递消息,无法读取它,并在前端收到消息后立即将其删除。

问题:

Alice 和 Bob 只接受 ID 和公钥,因此无法简单快速地区分他们之间是否存在 ManInTheMiddle,因为 UUID 与某些 SHA 哈希不同,通常看起来非常相似。随后生成的 uuid 可能仅存在单个字符的差异,并且人眼不容易识别这种差异。

想要的解决方案:

我需要某种完全确定性的 UUID(或从该 UUID 生成的某些字符串)的可视化,并且可以快速识别人眼的差异。

某种图片,用户的“头像”会很棒。

由于UUID有128位数据,我需要一些使用其中大部分数据的算法。

我尝试过的:

  1. 头像生成工具https://getavataaars.com/ - 允许创建头像图片,基于 10 个参数,每个参数包含多个选项,因此,如果我将它们全部相乘,我会得到: = 35*7*6*8*9*12*12*12*12*715.362.887.680 -> 34 位数据。,在我看来,太少了。但创建头像的想法对我来说很好。

  2. 头像生成工具https://8biticon.com - 与之前类似,有5*4*65*26*36*32= 38.937.600 -> 26 位数据

  3. Identicon http://identicon.net - 生成具有不同颜色的 5x5 二进制图片。例如33554432*amount of colors,如果存在所有“网络颜色”(216),则将有33554432*216= 大约33 位数据。我知道,可以使用更多的颜色,但是添加到列表中的颜色越多,它们就越难以区分。此外,这个图标没有任何意义,看起来像罗夏墨迹墨迹,并且在浏览器选项卡切换之间(第三方服务中的 Alice 消息和“安全应用程序”中实际生成的图标之间)不容易被记住。

  4. https://jdenticon.com/ - 我实际上无法计算这个算法可以生成多少图像,但它有一个像以前一样的缺陷。从某种意义上说,美丽的图案有时无法相互识别。

  5. Telegram 使用四个表情符号序列进行加密通话。据我发现,Unicode标准中有3521种情感,因此,四个图标将给出:3521*3521*3521*3521= 153.696.543.348.481 = 47位数据,这种方法使用更多位数据,然后是头像,并且具有不那么糟糕的易用性得到人类的认可。如果这个表情符号可以加入到某种“故事”中,识别会非常有效,但是只有四个不同的非链接图片,它的保存就好像我使用提到的头像服务生成(例如)四个头像并将它们放在一起。

  6. 我尝试制作图像生成器,其中每个像素都由单个字节指定,因此,128 位数据或 16 字节很容易转换为 4x4 像素化图片,但是,它看起来像视觉噪声,并且无法与其他图片区分开。

  7. 我想创建一些 UUID 的文本表示,例如,使用四个单词随机组合,但看起来像一个“故事”,如“<什么?> <谁?> <制作什么?> <与谁?>”。例如“蓝枪骑鸭子”、“搞笑锤子获取药丸”等等。但我需要再次创建形容词、名词、动词和名词列表,选择适合公式的列表。我怀疑我是否可以通过这种方法获取任何数据。

我错过了什么吗?

也许还有一些我还没有发现的其他算法?

也许我不需要使用全部 128 位,而只需创建一个更小的哈希值?我读过有关截断哈希值的问题,并且截断 UUID 有很多严重的问题(因此,如果使用截断,则有必要对 UUID 进行哈希处理,而不是“按原样”使用它)

我认为应该有一些“分形”算法,由源数据初始化将产生绝对独特的图片。例如,在 Mandelbrot 分形中,4D 坐标的微小差异会产生完全不同的图像。但就 Mandelbrot 而言,有很多坐标可以构成普通的单色正方形,因此,为了利用它,我必须创建一些分形 4D 空间的“意义区域图”。

另外,基于公钥的图像

我认为,基于用户 ID 构建图像是不够的,因为,更危险的情况是 ManInTheMiddle 可以以某种方式替代公钥,因此,由该邪恶密钥加密的消息可以由邪恶私钥解密。但是构建公钥图像存在保存问题,需要添加公钥的大小(可能约为 1K 字节长),因此要从公钥制作图像,我必须获取它的 sha256 (或其他)哈希值,并从哈希字符串构建图像,我们回到起点。

Mih*_*lpo 4

回答我自己的问题。

经过大量实验,我决定使用 avatar 引擎,可以在https://getavataaars.com/找到(实际上,它是 VanillaJS 版本: https: //github.com/HB0N0/AvataaarsJs

最后我制作了加密聊天应用程序的测试版: https: //cryptboard.io/

为任何人发布了它的源代码:https ://github.com/MihanEntalpo/cryptboard.io