我想开发一个移动应用程序并使用类似用户注册的 whatsapp。现在我想起了几年前讨论过的安全问题。 Whatsapp 过去仅通过电话号码和 IMEI 对用户进行身份验证。现在当然这不是很安全,但我真的不知道如何更安全。
现在我已经很久没有听到有关 Whatsapp 身份验证问题的消息了,所以我猜他们现在有安全的方法。你知道 Whatsapp 今天是怎么做到的吗?
最佳答案
我会在这个问题上试一试。
据我所知,Whatsapp 仍然使用您的电话号码作为主要的唯一标识符。首次登录 Whatsapp 时,您会验证电话号码是您自己的。
但是,Whatsapp 第二次在登录时提供 key 。这有助于避免一些攻击服务,如 Telegram 已经看到的,其中可以随时调用和拦截 SMS 以访问该帐户(看看他们的 Web 登录是如何工作的)。
确实,他们提供的这个 key 就是您的标识符,它安全地存储在本地,必须在所有进行中的请求中使用。当然,用户切换手机。在这种情况下,必须通过 SMS 重新激活该帐户,其中将生成一个新的 secret ID,使之前的 secret ID 无效。
因此,攻击者可以通过重新激活来尝试我所说的 SMS 拦截协议(protocol)。这样做的问题是您会意识到有人正在立即拦截您的流量,因为 Whatsapp 将在您自己的设备上被禁用。因此,只有当您有一段时间没有检查 Whatsapp 或处于互联网中断状态时,这才能成功。总的来说,这使他们的方法安全。
@Srinivas 您所观察到的只不过是 Whatsapp 在其验证服务器上存储特定电话号码在接下来的两个小时内无法验证,无论请求的来源如何。
编辑:回应@Srinivas 的评论:
The last part of your answer is absolutely correct. I did few tests and it works as you said. Thanks. But i am not clear on the 1st time login and 2nd time login.
我很抱歉没有彻底。我将尝试重新解释。
As i see whatsapp, initial screen is registration(sms code request screen) and 2nd login is verify code(verify sms code). Can you provide some more info for my understanding please?
我所说的第一次登录是指整个短信验证过程。因此,我将它分为两部分:
首次登录:用户请求短信验证码。如果来自其他设备,他们需要正确输入代码,或者让 Whatsapp 识别 SIM 卡并自动完成验证。然后他们登录并可以访问他们未传递或备份的消息(如果它是以前存在的帐户)。
第二次登录:在此验证过程之后,Whatsapp 会立即提供一个 secret 访问 token ,该 token 存储在设备本地。因此,每当他们打开应用程序并尝试连接到服务器时,他们都需要使用此访问 key 。正如我解释的那样,如果他们想在另一台设备上重新激活他们的帐户,他们必须从新设备再次完成第 1 步,然后新设备将生成一个新的 key ——使之前的 key 失效并使其只能使用新设备登录。
Here's some documentation i found who has created similar api : github.com/mgp25/Chat-API/wiki/WhatsApp-Registration-Flow. please provide your valuable input
我查看了文档,它们完全遵循相同的模式。可能让您感到困惑的是最初的“代码请求 token ”。这只是一个验证请求完成步骤 1 的设备的有效性的 key 。这确保了尝试注册其设备的用户的来源的合法性。
工作原理如下:
用户想要完成第一步。因此,他们将请求 token 连同他们的身份(电话号码)一起发送到服务器。这是在加载到应用程序时交付的代码。
这仍然不足以在步骤 1 中停止 SMS 拦截。鉴于请求的来源是合法的 Whatsapp 安装,SMS 验证码可以让攻击者访问用户的帐户。但是,正如我之前提到的,这会使先前从步骤 2 生成的 key 无效。因此,只要用户正在积极使用 Whatsapp 并连接到 Internet,用户就会注意到他们已经在本地注销。
如果还有什么困惑,请告诉我。
关于android - Whatsapp 身份验证如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29515110/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/