Tl;Dr:我正在创建一个应用程序:两个或多个用户之间的端到端加密聊天,需要快速方便的方法来直观地检查中间是否有人
应用程序背后的理念:
- Alice和Bob前端应用程序生成RSA公共+私有密钥(使用出色的jsencrypt库)
- Alice和Bob前端应用程序向服务器应用程序发送请求,因此服务器为Alice和Bob生成唯一ID(实际上是UUID)
- Alice和Bob前端应用程序生成链接以及二维码,在url的哈希部分包含他们的公钥和ID,因此在打开时不会发送到服务器
- 链接或二维码的照片可以由第三方渠道发送(不受保护),并且,打开后允许Alice和Bob前端应用程序将其对应添加到";联系人列表";(所有这些都发生在前端)
- Alice的应用程序从Bob的应用程序接收到公钥和ID后,使用公钥加密消息,并将其发送到服务器,指定Bob的ID
- Bob询问服务器";我的身份证有新信息吗&";,并在接收到来自服务器的消息后,通过他的私钥对其进行解密
- 服务器在任何时候都无法获得私钥或公钥。它只是生成ID,并在javascript前端加密的ID之间传递消息,无法读取,并在前端收到消息后立即删除消息
问题:
Alice和Bob只接受ID和公钥,因此,没有办法简单快速地区分它们之间是否有ManInTheMiddle,因为UUID与一些SHA哈希不同,通常看起来非常相似。顺序生成的uuid可能只因一个字符而不同,人眼不太容易重新发现这种差异。
想要的解决方案:
我需要某种UUID的可视化(或从该UUID生成的字符串),它是完全透明的,并且可以通过人眼快速识别差异。
某种图片,用户的";化身";那就太好了。
由于UUID有128位的数据,我需要一些使用大部分数据的算法。
我尝试过的:
-
化身生成工具https://getavataaars.com/-允许创建头像图片,基于10个参数,每个参数都包含几个选项,因此,如果我将所有参数相乘,我得到:
35*7*6*8*9*12*12*12*12*7
=15.362.887.680->34位数据在我看来,它太少了。但创建头像的想法对我来说很好。 -
化身生成工具https://8biticon.com-与以前类似,具有
5*4*65*26*36*32
=38.937.600->26位数据 -
Identiconhttp://identicon.net-生成具有不同颜色的5x5二进制图片。给出
33554432*amount of colors
,例如,如果存在所有";网页颜色";(216),则将存在33554432*216
=大约33比特的数据。我知道,可以使用更多的颜色,但添加到列表中的颜色越多,它们就越难区分。此外,这些图标没有任何意义,看起来像一个rorschach点,并且无法在浏览器选项卡切换(在第三方服务中的Alice消息和"安全应用程序"中实际生成的图标之间)之间轻松记忆 -
https://jdenticon.com/-我真的数不清这个算法能生成多少图像,但它和以前一样有缺陷。从某种意义上说,美丽的图案有时无法相互识别。
-
电报上的加密通话使用四个表情符号图标的序列。正如我所发现的,Unicode标准中有3521种情绪,因此,四个图标会给出:
3521*3521*3521*3521
=153.96.543.348.481=47位数据,这种方法使用更多的数据位,然后是头像,并且人类识别的容易性不那么差。如果这些表情符号可以加入某种";故事";,识别会很有效,但只有四张不同的未链接图片,就好像我使用提到的化身服务生成(例如)四个化身并将它们放在rogether上一样。 -
我试着制作图像生成器,每个像素都由一个字节指定,因此,128位或16个字节的数据很容易转换为4x4像素化的图片,但它看起来像视觉噪音,无法与其他图片区分开来。
-
我想创建UUID的一些文本表示,例如,使用随机组合的四个单词,但看起来像";故事"像"<什么>lt;谁>lt;做什么>lt;和谁在一起>";。例如";骑着一只鸭子的蓝色古尼科恩"有趣的锤子获取药丸";等等。但我需要再次创建形容词、名词、动词和名词的列表,选择适合这个公式的。我怀疑用这种方法是否能得到更多的数据。
我是不是错过了什么
也许还有其他一些算法,我还没有发现?
也许我不需要使用所有128位,只需要创建一个较小的散列?我读过关于构造散列的问题,截断UUID有很多严重的问题(所以,如果使用截断,则有必要对UUID进行散列,而不是"按原样"使用它)
我认为应该有一些";分形;算法,由源数据初始化将生成绝对唯一的图片。例如,在Mandelbrot分形中,4D坐标中的微小差异会产生完全不同的图像。但在Mandelbrot的例子中,有很多坐标构成了普通的单色正方形,所以,为了利用它,我必须创建一些";"意义区域地图";分形4D空间。
此外,基于公钥的图像
我认为,仅仅基于用户ID的构建图像是不够的,因为更危险的情况是,ManInTheMiddle可以以某种方式替代公钥,所以,用这个邪恶密钥加密的消息可以用邪恶私钥解密。但是构建公钥的映像有保存问题,增加了公钥的大小(它可能大约有1K字节长),所以要从公钥创建映像,我必须获得它的sha256(或其他)哈希,并从哈希字符串构建映像,我们回到了起点。
回答我自己的问题。
经过大量的实验,我决定使用可以在https://getavataaars.com/(实际上,它是VanillaJS版本:https://github.com/HB0N0/AvataaarsJs)
最后,我制作了一个加密聊天应用程序的测试版:https://cryptboard.io/
为任何人发布了它的源代码:https://github.com/MihanEntalpo/cryptboard.io