2017-09-05 14 views
12

Tôi muốn phát hành khung cảm ứng ca cao bao gồm một số tệp json chứa logic Tôi không muốn người dùng của framwork thấy; Thật không may bên trong các tập tin .framework vẫn còn có thể nhìn thấy json.ẩn các tệp .json khi được bao gồm trong khung cảm ứng ca cao

Tôi nghĩ về bao gồm nó trong một tập tin nhanh chóng:

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

nhưng json của tôi là lớn mà các tập tin không sử dụng được nữa. Tôi đã không tìm thấy một giải pháp để biên dịch dòng lệnh và sau đó bao gồm nó.

Có một giải pháp cho một trong hai vấn đề, ví dụ:

  • ẩn json bên trong khuôn khổ hoặc
  • tiền biên dịch một tập tin nhanh chóng và sau đó thêm nó vào khuôn khổ?
+0

Đặt tệp đó vào tệp nhưng được mã hóa, ví dụ: sử dụng mã hóa xor. Nó sẽ không thể đọc được cho người dùng ngẫu nhiên nữa – Sulthan

+0

@Sulthan bạn có thể giải thích điều này thêm một chút không? Những loại tập tin và làm thế nào tôi có thể mã hóa/giải mã này? – swalkner

+1

Những gì bạn muốn là obfuscation. Có hàng nghìn phương pháp để làm xáo trộn dữ liệu. Bạn thậm chí có thể mã hóa nó và đặt khóa mã hóa vào mã của bạn. Sẽ không ngăn ai đó thực sự muốn đọc dữ liệu và biết cách dịch ngược nhưng nó sẽ ngăn người dùng tò mò ngẫu nhiên. – Sulthan

Trả lời

-1

Bạn có thể thêm nội dung tệp json vào các nguồn dưới dạng chuỗi được mã hóa 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] 
    } 
} 

Bạn có thể sử dụng nó sau này bất cứ nơi nào trong khuôn khổ bạn bởi

print(JSONFiles.fileOneJSON) 

Hy vọng nó giúp bạn

UPDATE: Tại sao như mã hóa base64 chuỗi?

Các base64 lợi ích chính mã hóa chuỗi - bạn không cần phải thoát khỏi biểu tượng đặc biệt chứa trong JSON chuỗi. Không cần phải loại bỏ các ký hiệu dòng/biểu tượng dự định mới từ chuỗi json trước khi thêm vào tệp nguồn nhanh. Xem ví dụ

let string: String = "{ \"name\":\"John\", \"email\": \"[email protected]\" \"age\":30, \"car\":null }" 

Nhưng nếu json là phức tạp hơn? Nếu nó chứa 10 cấp độ lồng nhau, mảng, từ điển?

Bạn có thể trang trải bởi unittests rằng giá trị chứa trong fileOneBase64String có thể được giải mã để JSON đối tượng

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 ") 
     } 
    } 
} 
+1

làm thế nào mà một sự cải tiến để chỉ lưu trữ các json bên trong chuỗi? Base64 thậm chí còn dài hơn, phải không? – swalkner

+0

Lợi ích chính mà bạn không cần phải thoát khỏi các ký hiệu đặc biệt. Giải pháp này cho phép lưu trữ bất kỳ loại tập tin –

+0

Và nếu bạn sẽ thoát khỏi các biểu tượng trong chuỗi json thì chuỗi mới cũng sẽ lớn hơn sau đó bắt nguồn chuỗi json. –

0

Vì vậy, tôi đã tạo ra một struct JSONEncoder như sau:

public struct JSONEncoder { 

    private static var JSON = "" 
    public static var JSONData = [UInt8]() 
    private static var cipher = [UInt8]() 
    public static var encryptedJSONData = [UInt8]() 
    public static var decryptedJSONData = [UInt8]() 
    private static var decryptedJSON = "" 

    public static func JSONFileToString() {   
    guard let JSONFilePath = Bundle.main.url(forResource: "JSONFile", withExtension:"json"), let cipherFilePath = Bundle.main.url(forResource: "JSONCipher", withExtension:"txt") else { 
     return 
    } 

    do { 
     let text = try String(contentsOf: cipherFilePath, encoding: String.Encoding.utf8)   
     cipher = [UInt8](text.utf8) 
     let data = try Data(contentsOf:JSONFilePath) 

     if let JSON = String(data: data, encoding: String.Encoding.utf8) { 
     self.JSON = JSON 
     JSONData = [UInt8](JSON.utf8) 
     //print("data read: \(JSON)") 
     } else { 
     print("Data to string conversion failed") 
     } 
    } catch { 
     print(error.localizedDescription) 
    } 
    } 

    public static func encodeJSON() { 
    // encrypt bytes 
    for t in JSONData.enumerated() { 
     encryptedJSONData.append(t.element^cipher[t.offset]) 
    } 
    print(encryptedJSONData) 
    } 

    public static func decodeJSON() { 
    for t in encryptedJSONData.enumerated() { 
     decryptedJSONData.append(t.element^cipher[t.offset]) 
    } 
    decryptedJSON = String(bytes: decryptedJSONData, encoding: String.Encoding.utf8)! 
    //print(decryptedJSON) 
    } 

} 

Để thiết lập bạn cần thêm một tệp JSONFile.json chứa JSON bạn muốn mã hóa. Thêm nó để sao chép tài nguyên bó. Lặp lại điều này cho tệp văn bản mã hóa JSONCipher.txt. Đảm bảo tệp này không chứa dấu giọng nói, vì điều này mang đến lỗi và đủ lớn để mã hóa JSON. Đừng làm cho nó quá lớn nếu không bạn sẽ nhận được một cảnh báo bộ nhớ.

Bạn có thể chơi xung quanh với điều này, để mã hóa một tập tin JSON với XOR, sử dụng

JSONEncoder.JSONFileToString() 
JSONEncoder.encodeJSON() 

này sau đó sẽ in ra cửa sổ Console, và bạn có thể sao chép mã này vào một tập tin txt kèm theo khuôn khổ của bạn.

Đối với giải mã tập tin này, bạn có thể kiểm tra như sau:

JSONEncoder.decodeJSON() 

(uncommenting tuyên bố print trong decodeJSON trong JSONEncoder struct, có thể kiểm tra các công trình này)

Nếu tệp JSON của bạn quá lớn cho chương trình này, bạn thực sự có thể sử dụng công cụ này: https://www.browserling.com/tools/xor-encrypt và XOR Decrypter tương tự trên cùng một tên miền. Sau đó, bạn có thể sử dụng đầu ra từ bộ mã hóa này để thêm tệp JSON được mã hóa vào khung của bạn. Chỉ cần chắc chắn rằng bạn sử dụng cùng một phím khi bạn giải mã các json!

Lưu ý rằng điều này lưu trữ tệp văn bản của bạn trong dự án thực tế: điều này có khả năng không an toàn. Có thể lưu trữ tệp JSONCipher.txt trên máy chủ và tìm nạp tệp đó bằng mã thông báo truy cập được xác thực. Mã tôi đã cung cấp có thể được sửa đổi để cho phép điều này.

Tôi hy vọng điều này đã chỉ cho bạn đúng hướng để giải mã mã.

Các vấn đề liên quan