Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无SSL/HTTPS的Android/ASP RESTful API身份验证_Java_Android_Rest_Security_Authentication - Fatal编程技术网

Java 无SSL/HTTPS的Android/ASP RESTful API身份验证

Java 无SSL/HTTPS的Android/ASP RESTful API身份验证,java,android,rest,security,authentication,Java,Android,Rest,Security,Authentication,这是一个常见的SO问题,但没有明确的答案 我的设置: 我有一个网站上运行的经典ASP与备份数据库。不幸的是,没有可用的SSL证书 我有一个Android应用程序,它将发送一个谷歌截击,使用定制但简单的API从站点请求数据 当前: 我仍在私下进行测试,因此目前我仅访问该网站: 在应用程序上,用户只需输入一次用户ID和密码 用户导航到与特定ASP页面关联的片段,该页面将返回一些数据 截击被发送到/mysite.com/_-api/apage.asp?m=md5hashhereabcdefghi

这是一个常见的SO问题,但没有明确的答案

我的设置:

  • 我有一个网站上运行的经典ASP与备份数据库。不幸的是,没有可用的SSL证书
  • 我有一个Android应用程序,它将发送一个谷歌截击,使用定制但简单的API从站点请求数据
当前:

我仍在私下进行测试,因此目前我仅访问该网站:

  • 在应用程序上,用户只需输入一次用户ID和密码
  • 用户导航到与特定ASP页面关联的片段,该页面将返回一些数据
  • 截击被发送到/mysite.com/_-api/apage.asp?m=md5hashhereabcdefghijk
  • 服务器在用户记录中搜索匹配的哈希(基于UserID+SALT+pass构建)。在匹配记录上,它使用找到的用户ID作为用户ID
  • asp执行一些sql查询并返回一个JSON对象
  • 应用程序接收此JSON响应并进行解析
问题:

任何包嗅探(MITM)都能够清楚地看到正在访问的URL(和服务器响应),并能够通过浏览器复制查询。这就是我想要阻止的。通过反编译APK,可以很容易地看到应用程序中的任何盐或密钥

问题:


我读过各种不同的解决方案,但没有一个真正适合我的环境。我不能使用ASP会话变量(RESTful是无状态的),我不能使用HTTPS(SSL/TLS),因为服务器上没有证书。我不能使用基于应用程序的密码,因为这可以反编译并很容易看到

我很感激你永远不会得到100%安全的东西,但只能让人们对入侵一个系统不感兴趣,或者让它变得不值得

建议的解决方案:

我想就以下建议方法获得一些反馈/想法:

  • 每个请求都有自己的握手来验证应用程序
这将是这样的:

  • 用户首次打开应用程序并输入用户ID/密码。在卸载(或注销)之前,这将一直保留在应用程序中,但我打算让用户的应用程序保持登录状态
  • 用户在应用程序中导航到与服务器上特定页面对应的片段
  • 截击是通过以下方式发送的:
    • UserAgent HTTP头“某些值”
    • 为(userid+salt+pass)生成相同的身份验证哈希
    • 使用公钥加密此哈希
    • 一个查询字符串/apage.asp?q=abcdefghijk。。。。发送到服务器
    • 服务器使用其私钥解密
    • 服务器和我当前一样检查此哈希
    • 页面返回纯文本JSON值(未加密)
同样的问题也发生在这里,MITM或嗅探器可以复制URL并获取相同的信息

第二个建议的解决方案:

如果每一个请求都是从整个握手开始的,会更好吗

  • 应用程序向服务器发送截击请求握手(HELO)
  • 使用UserAgent HTTP标头检查服务器严重错误
  • 服务器记录请求的时间戳和IP,并生成唯一的随机代码
  • 应用程序接收此代码并使用该唯一代码作为Salt构建新哈希
  • 应用程序将第二次截击发送到/apage.asp?m=MD5(用户标识+唯一代码+密码)
  • 使用原始IP、时间戳+容差(两个请求之间的30秒?)和UserAgent请求头进行服务器严重错误检查
  • APage.asp使用此哈希对请求进行身份验证,前提是前面的步骤已成功通过
  • asp根据请求返回一个JSON对象
  • 服务器将原始IP/时间戳的日志标记为已过期,或者仅删除该记录
这一初始步骤将使嗅探器或MITM更难复制URL调用,因为a)每个请求将有一个随机返回的代码B)每个代码/哈希组合只能使用一次

我唯一能想到的就是有人对应用程序进行反编译,并看到握手的方法,所以我可以尝试复制它。但是,用户名/密码散列永远不会匹配,因为这是他们无法从散列中获得的唯一内容(因为它是用随机代码腌制的)

想法?是否可以使用一些RSA公钥/私钥加密技术来改进它?我可以生成我的查询字符串apage.asp吗?m=abcdeghi…,生成一个MD5散列,附加到末尾,然后在发送之前加密


非常感谢

“没有可用的SSL证书”。如何?“我不能使用ASP会话变量(RESTful是无状态的)”-为什么不设置会话cookie?另外:请迁移出该服务器,这会给自己带来不必要的麻烦。