【问题标题】:hide .json files when included in Cocoa Touch Framework包含在 Cocoa Touch 框架中时隐藏 .json 文件
【发布时间】:2017-09-05 17:35:52
【问题描述】:

我想发布一个可可触摸框架,包括一些 json 文件,其中包含我不希望框架的用户看到的逻辑;不幸的是,在.framework 文件中,json 仍然可见。

我考虑将它包含在一个 swift 文件中:

struct JsonProvider {
    static let json = "..."
}

但是我的 json 文件太大了,以至于文件不再可用。我没有找到命令行编译然后包含它的解决方案。

是否有解决这两个问题之一的方法,即

  • 将 json 隐藏在框架内或
  • 预编译一个 swift 文件,然后将其添加到框架中?

【问题讨论】:

  • 把它放到一个文件中但是已经编码了,例如使用异或编码。随机用户将不再可读
  • @Sulthan 你能解释一下吗?什么样的文件,我该如何编码/解码?
  • 你想要的是混淆。有上千种方法可以混淆数据。您甚至可以对其进行加密并将加密密钥放入您的代码中。两者都不会阻止真正想要读取数据并知道如何反编译的人,但它会阻止随机好奇的用户。
  • @swalkner 我的回答有帮助吗?

标签: json swift cocoa-touch


【解决方案1】:

这个问题的答案实际上取决于您需要文件的安全程度。没有什么是 100% 安全的,但您可以让攻击者或多或少地难以获得访问权限。

选项 A:隐藏文件

添加一个“。”在文件名的开头,这将使那些浏览不知道隐藏文件的目录的人隐藏它。

注意事项:

  • 任何了解隐藏文件的人都可以弄清楚这一点。

选项 B:混淆

使用 Base64 或其他编码方法对文件进行编码。

注意事项:

  • 只阻止懒惰/有点好奇的人。编码很容易被破解。

选项 C:加密或存储在代码中

使用对称算法(如 AES)加密文件并将密码存储在代码中。

或者,删除 json 文件并使用包含 json 的字符串在代码中创建一个变量。

var myJson = """
{
 "jsonData": "value"
}
"""

注意事项:

  • 可以反编译代码以显示硬编码字符串,但这很困难。必须有人访问您受 Apple 的 DRM 保护的 .ipa 文件。您也可以选择对字符串进行编码,但如果有人已经在反编译您的代码,那么他们可以弄清楚如何消除混淆。

选项 D:根本不包含文件

这是一个非常广泛的话题,超出了您的问题范围,但基本上您将文件托管在某个地方。您在何处以及如何再次执行此操作取决于您需要数据的安全性。理想情况下,通过 HTTPS 提供数据并阻止在您的应用中使用自签名证书,使其无法被代理(即中间人)。

URLSession 已经在这方面做得很好,但您可以通过使用证书固定来更进一步:https://developer.apple.com/news/?id=g9ejcf8y

本质上,您在服务器上创建证书配置并在应用程序中捆绑公钥,除非满足固定要求,否则连接将被拒绝。需要注意的是,每当您的证书更改时,您都必须更新您的应用程序。

【讨论】:

    【解决方案2】:

    有很多方法:

    • 您可以在使用前再次加密该文件结束解密。
    • 将 json 文件类型更改为图片或其他内容,以确保没有人知道这是 JSON 文件。

    【讨论】:

      【解决方案3】:

      您可以将 json 文件内容作为 base64 编码字符串添加到源中。

      struct JSONFiles {
          internal static let fileOneBase64String = "iVBORw0KGgoAAAANSUhEUgAAAMEAAADLCAYAAADX..."
          static var fileOneJSON: [String: Any] {
              let data = Data(base64Encoded: fileOneBase64String)!
              return try! JSONSerialization.jsonObject(with: data, options: []) as!  [String: Any]
          }
      }
      

      您可以稍后在框架中的任何位置使用它

      print(JSONFiles.fileOneJSON)
      

      希望对你有帮助

      更新: 为什么使用 base64 编码的字符串?

      base64 编码字符串的主要好处 - 你不需要转义 JSON 字符串中包含的特殊符号。在添加到 swift 源文件之前,不需要从 json 字符串中删除新的行符号/意图符号。 见例子

      let string: String = "{ \"name\":\"John\", \"email\": \"hello@stackoverflow\" \"age\":30, \"car\":null }"
      

      但是如果json更复杂呢?如果它包含 10 个嵌套级别、数组、字典?

      您可以通过 UnitTests 覆盖 fileOneBase64String 中包含的值可以解码为 JSON 对象

      import XCTest
      @testable import MyAwesomeFramework
      
      class FrameworkTests: XCTestCase {
      
          func testThatBase64EncodedJSONStringCanBeDecoded() {
              let data = Data(base64Encoded: JSONFiles.fileOneBase64String)
              XCTAssertNotNil(data, "Unable to convert base64 string to Data")
              do {
                  _ = try JSONSerialization.jsonObject(with: data, options: [])
              } catch {
                  XCTFail("Expected decoded JSON ")
              }
          }
      }
      

      【讨论】:

      • 仅将 json 存储在字符串中有何改进? Base64 更长,对吧?
      • 您不需要转义特殊符号的主要好处。该解决方案允许存储任何文件类型
      • 如果你将转义 json 字符串中的符号,那么新字符串也会比原始 json 字符串大。
      猜你喜欢
      • 2016-05-04
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2015-08-26
      • 1970-01-01
      相关资源
      最近更新 更多