在搜索 SSL 和 HTTPS 一天之后,我完全不知道如何做一些非常简单的事情。我有一个没有用户身份验证的小应用程序。所有用户都会看到一个简单的应用。
我正尝试为此使用 Google 翻译 API。我有一个翻译 API key ,但我完全不知道如何保护它。我想直接从我的 iOS 应用调用 Google 翻译,根据 api 文档 ( https://cloud.google.com/translate/docs/reference/rest ),apiKey 作为请求参数“key”提供。 API 文档还说 Google 翻译支持 SSL,但显然我没有对我的 ios 应用程序进行任何类型的 SSL 检查来确认身份。我的问题是,如何阻止可以获取我的翻译 API key 并滥用它的 MITM 攻击?我尝试使用 Charles,我清楚地看到正在传递的 key 。
我在 Internet 上阅读的所有资源都说他们使用 SSL,一切都很好。但是没有关于如何在使用 Google 等流行服务的 iOS 应用程序中使用 SSL 的示例。
关于如何发出这个简单的 GET 请求并防止我的 key 被盗有什么想法吗?
编辑:
SSL Pinning 在这方面有点矫枉过正。我没有考虑使用 SSL,但我不知道它如何与 iOS 和像 Google 这样的实体一起工作(根据下面与 @pvg 的讨论)。
最佳答案
您正在尝试使用 HTTPS,因为您不希望人们知道您的 API key 。如果您的应用程序直接连接到谷歌翻译,您是否考虑过 API key 的存储位置? :)
您必须将您的 API key 与您的应用程序一起分发给 Google 翻译。几乎每个人都会这样。这可能是问题,也可能不是问题,我认为 Google API key 通常以 Javascript 的形式发送到浏览器客户端,因此它们并不是什么大 secret 。保护它免受用户侵害的唯一方法是运行您自己的服务器,使用存储在您服务器上的 API key 将您的应用查询转换为 Google 翻译查询。
(也许这是显而易见的,但请注意 HTTPS 是一种传输协议(protocol),它保护动态数据,即当它通过网络发送时,但不保护静止数据,即当它在您的移动应用程序中时电话。)
至于如何确保没有人冒充谷歌的服务器,以及是否需要证书固定。证书是您的保证,在大多数情况下,这是不可能的。几乎任何您选择与 https 网络服务器通信的标准方法,您的底层框架和/或操作系统都会验证服务器证书并确保没有模拟。这就是证书的用途。证书固定用于减轻客户端上安装的恶意受信任根证书之类的威胁。例如在公司网络中,通常情况下公司 CA 根证书作为受信任的根安装在托管客户端上,从那时起,公司代理也可以通过伪造服务器 key 和证书来窥探客户端 SSL 流量。这是唯一可能的,因为公司根证书是预装的,攻击者是不可能的。类似的威胁是当攻击者设法将他的证书作为受信任的根安装在客户端上时,但这种情况不再很常见了。根据您的威胁模型,您可能需要针对它的保护,但在大多数情况下,使用标准 Web 客户端与 https API 对话足以验证服务器,您可以确定当您从 https://google.com 下载内容时,实际上来自 google.com。
关于ios - 在 HTTP 请求中保护 API key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40698130/
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara
我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token