基于字符串或uuid生成人类可区分的图片 应用背后的理念:问题:想要的解决方案:我尝试过的:我是不是遗漏了什么?此外,基于公钥的图像

问题描述

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

应用背后的理念:

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

问题:

Alice 和 Bob 只接受 ID 和公钥,因此,无法简单快速地区分它们之间是否存在 ManInTheMiddle,因为 UUID 不像某些 SHA-hash 通常看起来非常相似。连续生成的 uuid 可能只有一个字符不同,人眼不太容易识别这种差异。

想要的解决方案:

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

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

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

我尝试过的:

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

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

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

    @H_404_16@
  4. http://identicon.net - 我真的数不清,这个算法可以生成多少张图像,但它有一个像以前一样的缺陷。从某种意义上说,美丽的图案有时无法相互识别。

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

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

    @H_404_16@
  7. 我想创建一些 UUID 的文本表示,例如,使用随机组合的四个单词,但看起来像一个“故事”,如“”。比如《蓝枪骑鸭》、《搞笑锤子取丸》等。但我需要再次创建形容词、名词、动词和名词的列表,选择适合公式的列表。而且我怀疑我可以通过这种方法获得更多的数据。

    @H_404_16@

我是不是遗漏了什么?

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

也许我不需要使用所有 128 位,而只需创建一个较小的哈希?我读过关于截断散列的问题,截断 UUID 有很多严重的问题(因此,如果使用截断,则需要对 UUID 进行散列,而不是“按原样”使用它)

我认为应该有一些“分形”算法,即由源数据初始化会产生绝对独特的图片。例如,在 Mandelbrot 分形中,4D 坐标的微小差异会产生完全不同的画面。但是在 Mandelbrot 的情况下,有很多坐标可以制作纯单色正方形,因此,为了利用它,我必须创建一些分形 4D 空间的“意义区域图”。

此外,基于公钥的图像

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)