云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

云主机_成人电影百度云_

小七 141 0

优化Pwned密码的缓存(使用worker)

今年2月,特洛伊·亨特发布了Pwned密码v2。这个数据库包含超过5亿个真实世界泄露的密码,为纠正业界如何应对现代密码安全威胁提供了一个至关重要的工具。为了支持这个项目,我构建了一个k-匿名模型,为执行的查询添加了一层安全性。此模型允许通过将多个泄漏的密码哈希映射到单个哈希前缀来增强缓存,并以确定的HTTP友好方式执行(这允许缓存,而私有集交集的其他实现需要一定程度的随机性)。自发布以来,使用这种匿名模型并由Cloudflare提供的PwnedPasswords已经在各种平台上得到了广泛的实现,从EVE Online和Kogan等网站到1Password和Okta的PassProtect等工具。Firefox Monitor在检查电子邮件是否存在数据泄露时也使用匿名模型。自从它被采用以来,Troy就在推特上发布了关于高缓存命中率的消息;人们也一直在问我如何获得如此高的缓存命中率的"秘密方法"。随着时间的推移,我接触了Cloudflare的缓存系统的各个部分;2016年末,我致力于为我们的自助业务计划用户提供绕过缓存的Cookie功能,并与CSRF代币的缓存含义进行了搏斗——不过,Pwned密码更有趣,有助于从用户的角度展示Cloudflare缓存功能的威力。看来Pwned密码的流量已经开始比正常情况翻了一番,现在每天有800万个请求。@IcyApril在10号左右对缓存进行了更改,以提高稳定性,但命中率有所降低,但现在随着更高的容量(上周为94%)这一情况又有了改善。pic.twitter.com/HwMDLlmBEY-特洛伊亨特(@troyhunt)2018年6月25日@IcyApril秘道会被释放吗?!-尼尔(@tun35)2018年5月7日值得注意的是,PwnedPasswords并不像一个典型的网站在缓存方面-它包含16^5个可能的API查询(任何形式的五个十六进制字符,总共超过一百万个可能的查询),以保证API中的k-匿名性。虽然API保证k-匿名性,但它不保证l-多样性,这意味着单个查询可能比其他查询发生更多。对于普通网站来说,资产越少,缓存命中率就越高。这方面的一个例子是另一个使用我们的无骨架计划的site Troy设置;通过简单地配置一个带有Cache Everything选项的页面规则(并设置一个Edge Cache TTL选项,如果来自您的源代码的Cache-Control头不这样做),您就可以轻松地缓存静态HTML。当我在@haveibeenpwned上写过@Cloudflare提供的非常高的缓存命中率时,一些人认为这是由于更高级别的计划。这是https://t.co/Y4GlsInvu2按*免费*计划运行:请求的缓存命中率为99.0%,带宽为99.5%。免费!pic.twitter.com/pP0wo7qKF3-特洛伊亨特(@troyhunt)2018年7月31日原点标题实际上,查询通常是API查询这一事实造成了很大的不同。在优化缓存时,最重要的是要查找同一个缓存资产为不同的缓存键多次存储的实例;对于某些资产,这可能涉及到出于缓存目的而选择性忽略查询字符串,但对于API,问题更为详细。当从JavaScript资产发出HTTP请求时(就像在登录表单中直接实现PwnedPasswords时所做的那样),站点还将发送一个Origin头来指示获取的来源。当你搜索haveibeenpwned.com/Passwords, 有一点JavaScript获取密码并应用k匿名模型,方法是SHA-1散列密码并将散列截断到前五个字符,然后将请求发送到https://api.pwnedpasswords.com/range/A94A8(然后执行检查以查看响应中是否包含任何后缀)。在此请求的标题中PwnedPasswords.com网站,您可以看到请求包含查询站点的源标头。此标头通常有助于减少跨站点请求伪造(CSRF)漏洞,因为它只允许某些来源使用跨源资源共享(CORS)发出HTTP请求。在API的上下文中,这在没有状态(即cookies)的情况下没有意义。但是,Cloudflare的默认缓存键包含此头,供希望使用它的用户使用。这意味着,每当出现不同的源标头时,Cloudflare将存储资产的新缓存副本。虽然这通常不是一个问题(大多数网站只有一个原始标头,或者在使用CORS时只有一小部分),PwnedPasswords有来自互联网上所有网站的来源标头。由于Pwned密码对于给定的请求总是以相同的方式响应,而不考虑原始标头-我们可以使用自定义缓存密钥功能从缓存密钥中删除此标头。顺便说一句,JavaScript cdn经常会被请求从另一个JavaScript资产中获取作为子资源的资产-从其缓存键中删除Origin头也有类似的好处:在一段时间内,使用@JS缓存的@91%的流量与缓存的比率比较低。部署后30分钟的流量显示缓存命中率在不断增长(有计划地清除缓存!)。pic.twitter.com/ZQmfzEi4Y2-Junade Ali(@IcyApril)2018年5月6日不区分大小写在与eveonline的Stefán Jökull Sigurðarson交谈后,我意识到不同的用户使用不同的大小写查询资产;例如,不是range/A94A8,而是对range/A94A8的请求将得到相同的资产。由于缓存键考虑了大小写敏感度,因此资产将被缓存两次。不幸的是,API已经是公开的,一旦我开始这些优化,两种形式的套管都可以接受。输入Cloudflare Workers我没有调整缓存键来解决这个问题,而是决定使用Cloudflare Workers——这允许我使用JavaScript调整缓存行为。Troy最初在现场有一个简单的工人来启用CORS:addEventListener('fetch',事件=>{事件响应(检查和调度报告(事件请求))})异步功能检查和调度报告(req){如果(要求方法==='选项'){让responseHeaders=setCorsHeaders(new Headers())返回新响应(''{标题:responseHeaders})}其他{返回等待获取(req)}}函数setCorsHeaders(标头){标题.set('Access-Control-Allow-Origin','*')标题.set('Access-Control-Allow-Methods','GET')标题.set('Access-Control-Allow-Headers','Access-Control-Allow-Headers')标题.set("访问控制-最大年龄",1728000)返回标题}我添加到这个worker是为了确保当请求离开Workers时,hash前缀始终是大写的,另外,我使用cacheKey标志在发出请求时允许在Workers中直接设置缓存键(而不是使用我们内部的自定义缓存键配置):addEventListener('fetch',事件=>{事件响应(手柄请求(事件请求));})/***使哈希前缀大小写一致后获取请求*@param{Request}请求*/异步函数handleRequest(请求){如果(请求.方法==='选项'){让responseHeaders=setCorsHeaders(new Headers())返回新响应(''{标题:responseHeaders})}const url=新url(请求.url);如果(!url.pathname.startsWith("/range/"){const response=等待获取(请求)返回响应;}常量前缀=url.pathname.substr(7) ;const newRequest="https://api.pwnedpasswords.com/range/" + 前缀.toUpperCase()如果(前缀===前缀.toUpperCase()) {const response=await fetch(请求,{cf:{cacheKey:newRequest}})返回响应;}常量初始化={方法:请求.方法,标题:请求.headers}const modifiedRequest=新请求(newRequest,init)const response=等待获取(modifiedRequest,{cf:{cacheKey:newRequest}})返回响应}函数setCorsHeaders(标头){标题.set('Access-Control-Allow-Origin','*')标题.set('Access-Control-Allow-Methods','GET')标题.set('Access-Control-Allow-Headers','Access-Control-Allow-Headers')标题.set("访问控制-最大年龄",1728000)返回标题}顺便说一句,我们的工人团队正在研究一些非常酷的东西来控制我们的缓存API在一个细粒度的水平,你将能够看到一些东西,在适当的时候,通过下面的博客。阿尔戈最后,Argo在提高缓存命中率方面起着重要作用。一旦启用,它就可以优化流量在互联网上的传输速度,但这也意味着,当流量从一个Cloudflare数据中心路由到另一个数据中心时,如果某个资产缓存在靠近原始web服务器的位置,则该资产将从该数据中心提供服务。本质上,它提供了分层缓存功能;通过确保当流量来自使用较少的Cloudflare数据中心时,它仍然可以利用来自接收更大流量的数据中心的缓存(更可能在缓存中拥有资产)。这就避免了一项资产在从缓存获得服务的同时,不得不在世界各地旅行(即使不是最接近用户的地方)。结论通过使用Cloudflare的缓存功能,我们能够减少由于请求参数的意外变化而导致单个资产在缓存中的次数。Workers提供了一种机制来控制Cloudflare上的资产缓存,并在活动开发中提供了更细粒度的控制。通过在Pwned密码上实现这一点,我们能够为开发人员提供一个简单而快速的界面,以减少用户对密码的重用,从而限制凭证填充攻击对其系统的影响。要是艾琳·阿德勒用过密码管理器就好了:有兴趣帮助调试各种规模网站的性能、缓存和安全问题吗?我们在招聘S