端到端加密聊天web应用程序2023/2024年第2学期如今,web服务是最重要的用户的常见应用程序形式暴露于。Web浏览器成为计算机上的流行应用程序使用户能够访问这些web服务。确保web服务的安全是对互联网至关重要。此外,隐私的一个重要特征现代。您的工作是实现端到端加密聊天web应用程序以及保护网站的各个方面。
概述
目标
1.调整一个基本的聊天网络应用程序,使其成为一个安全的E2EE聊天网络应用2.符合NIST特别出版物800-63B“数字”中的一些要求身份指南——身份验证和生命周期理”,适用于美国联邦机构(这也是其他类型系统的参考)
3.实现基于密码和OTP(或FIDO2)的安全MFA机制4.加密两个用户之间的通信,使服务器不知道消息的内容(E2E加密)
5.通过配置现代TLS部署来保护传输中的通信
6.打包您的网络应用程序的docker图像
要求(身份验证)
1.来自NIST特别出版物800-63B:
1.符合以下各节的所有“应”和“宜”要求
2.使用以下验证器:用户选择的记忆密码(即密码/密码短语)和单因素OTP设备(例如Google Authenticator)或单因素加密设备(例如Yubikey)(如果您有)和查找机密(恢复密钥)符合§5.1和§4.2.2中的相关要求
§5.1.1.2:“记忆中的秘密应使用合适的单向密钥进行加盐和散列处理推导函数”有关适当的功能,请参阅我们的密码安全讲座记忆秘密验证器(§5.1.1.2)
选择“从以前的违规公司获得的密码”,并参考
https://haveibeenpwned.com/API/v3#PwnedPasswords以供语料库检查自动遵守§5.2.8和§5.2.9要求(身份验证)
1.来自NIST特别出版物800-63B:
3.§5.2.2:实施速率限制机制和基于图像的CAPTCHA4.在上实现新的帐户注册和绑定验证器(OTP/Yubikey和恢复密钥)同时可选:提供一种在帐户注册后更改验证器的方法
5.§7.1:实施适当的会话约束要求
6.例外情况:
OTP验证器——尤其是基于软件的OTP生成器——应该劝阻和不得促进将密钥克隆到多个设备上。谷歌验证器和相关应用程序正常
要求(E2EE聊天)
2.用户登录后,以某种方式保护两个用户之间的聊天消息,使服务器无法解密消息
1.使用ECDH密钥交换协议在两个用户之间建立共享秘密利用WebCrypto API,请参阅演示https://webkit.org/demos/webcrypto/ecdh.html密钥交换过程中交换的可以通过服务器发送信任服务器不会修改密钥交换的消息选择P-384作为基础曲线
2.从共享秘密中导出两个256位AES-GCM加密密钥和两个256比特MAC密钥使用HKDF-SHA256一个密钥用于在user1到user2之间加密,另一个密钥从user2到user1再次使用WebCrypto API,请参阅https://developer.mozilla.org/enUS/docs/Web/API/HkdfParams盐应该是唯一的,这样将来的另一个密钥派生会产生不同的密钥,使用例如从1开始的计数器nfo参数应表示当前上下文(例如,的“CHAT_KEY_USER1to2”用户1的密钥user2,“CHAT_MAC_USER1to2”表示user1的MAC密钥user2)要求(E2EE聊天)
2.用户登录后,以某种方式保护两个用户之间的聊天消息,代 写COMP3334 端到端加密聊天web应用程序使服务器无法解密消息
3.消息将在GCM模式下使用AES加密
96位IV是表示使用相同密钥加密的消息数量的计数器注意:GCM不需要不可预测的IVs,而是需要独特的IVs将IV和密文一起发送给收件人作为接受者,验证静脉注射 > 四、1以防止重放攻击使用派生的MAC密钥使用HMAC-SHA256保护IV,以防止攻击者选择IVs相关数据应反映当前上下文(例如,“CHAT_MSG_USER1to2”)身份验证标签应为128位
4.将所有关键材料存储在浏览器的HTML5本地存储中,以便在浏览器之后检索重新打开
5.显示正在交换的先前消息的历史记录+新消息
如果本地存储已被清除,则无法解密以前的消息,显示警告要求(E2EE聊天)
2.用户登录后,以某种方式保护两个用户之间的聊天消息,使服务器无法解密消息
6.当用户点击
聊天中的“刷新”按钮(而不是浏览器刷新按钮),使用新的盐要求更改的参与者应通过特殊信息通知另一方
由已使用的最后一个IV组成,字符串“change”,完全受保护旧MAC密钥与新MAC密钥消息上的两个不同MAC另一方应在处理消息之前验证旧MAC,然后导出新密钥,并在接受新密钥之前再次验证新MAC双方应在聊天记录中显示一条消息“密钥已更改”当浏览器重新打开时,应保留旧密钥以解密旧消息应根据前面的值确定要用于给定消息的密钥集在密钥交换期间发送(即,跟踪用户公钥)超过一分钟的密钥交换消息不应被视为新密钥
要参与的交换
要求(E2EE聊天)
2.用户登录后,以某种方式保护两个用户之间的聊天消息,使服务器无法解密消息
7.当本地存储被清除时,或者当给定收件人没有共享机密时发送方应使用特殊消息启动ECDH密钥交换,接收方应即使之前已经建立了共享秘密,也要参与密钥交换
8.聊天消息应使用UTF-8编码,用户之间的网络消息应为使用您自己的模式(例如,{“type”:“ECDH”、“key”:“…”}、{“type”:“msg”,“密文”:“…”,“IV”:“.”,“MAC”:“..”})9.使用console.log()记录所有加密操作(包括密钥、IV、明文等)从视觉上看,IVs不可重复使用,按键在需要时会发生变化(见下一页要求)等。
10.聊天应用程序应防止跨站点请求伪造(CSRF)、跨站点脚本(XSS)和SQL注入攻击
要求(TLS)
3.通信应在传输过程中使用TLS进行加密,配置如下:重新使用Mozilla的nginx“现代”配置,并根据需要进行更改: https://ssl-config.mozilla.org/1.仅限TLS版本1.3
2.x25519仅椭圆曲线组
3.仅TLS_CHACHA20_POLY1305_SHA256密码套件4.没有OCSP装订(因为您将使用自签名的CA证书)5.HSTS为期一周
6.TLS证书要求:
1.X.509版本3
2.P-384上的ECDSA公钥
3.SHA384作为签名的哈希算法
4.CA标志(关键):false
5.密钥使用(关键)=数字签名
6.扩展密钥使用=服务器身份验证
7.包括主题密钥标识符和授权密钥标识符
8.有效期=90天
要求(TLS)
3.通信应在传输过程中使用TLS进行加密,配置如下:7.网站应位于
https://group-[您的组号].comp3334.xavier2dc.fr:8443/第10组将在Group-10.comp3334.xavier2dc.fr8.所有子域*.comp3334.xavier2dc.fr将重定向到127.0.0.1您可以有效地使用“group-X.comp3334.xavier2dc.fr”而不是“localhost”如果您没有在localhost上托管docker容器,在主机文件中添加手动条目
Linux:/etc/主机
Windows:C:\Windows\System32\drivers\etc\hosts9.从给定的CA证书和私钥颁发证书使用与您的组对应的域名域名应同时显示为通用名称和使用者备选名称
10.CA证书的域限制为comp3334.xavier2dc.fr的子域,意思是你可以在你的计算机上安全地信任它(没有人可以为其他人生成有效的证书域)简单聊天演示
1.在包含dockercompose.yaml文件的文件夹中使用以下行部署docker容器:$sudo docker compose up-d2.到目前为止,聊天应用程序在8080端口上通过纯HTTP工作,访问地址:http://group-0.comp3334.xavier2dc.fr:80803.打开浏览器的新私人窗口,然后再次访问网站
1.铬:
2.Firefox:
4.在第一个窗口中以Alice(密码:password123)的身份登录5.以Bob(密码:password456)的身份登录第二个(私人)窗口6.从Alice聊天中选择Bob作为联系人,从Bob聊天中选择Alice作为联系人7.互相发送消息!
8.当修改服务器端(app.py)或客户端(login.html,chat.html)时,只需重新启动docker容器,则不需要重新构建容器:
$sudo docker restart[you container name]-webapp-1评估领域
1.对您的解决方案和设计的解释[50%]
提供实施的功能/要求列表
描述您的解决方案是如何工作的,特别是解释用户密码是如何存储、验证、使用哪些库、如何派生关键材质、如何你存储它们吗,它们的大小,你如何生成域