【问题标题】:Decrypt String when decoding JSON on Swift在 Swift 上解码 JSON 时解密字符串
【发布时间】:2018-01-29 11:58:04
【问题描述】:

我有一个 JSON 文件和一个相关的类。我通过调用 init?(data: Data) 初始化程序对其进行解码。我正在从端点获取这个 JSON。我想用 SHA-256 加密 URL 文本。我的问题是我想在解码数据时解密这个 URL 字符串。所以在解码URL时,需要调用一个函数。有什么可能的方法吗?

PS:我知道我可以编写加密文本并在我将使用的地方对其进行解密,但我想将此作为最后的选择。

struct TableCellData: Codable {
    let type: Int
    let cellText: String
    let cellImage: String?
    let url: URL?
    let detailText: String?
    let tableID: Int?

    enum CodingKeys: String, CodingKey {
        case type = "type"
        case cellText = "cell_text"
        case cellImage = "cell_image"
        case url = "url"
        case detailText = "detail_text"
        case tableID = "table_id"
    }
}

extension TableCellData {
    init?(data: Data) {
        guard let me = try? JSONDecoder().decode(TableCellData.self, from: data) else { return nil }
        self = me
    }

    init?(_ json: String, using encoding: String.Encoding = .utf8) {
        guard let data = json.data(using: encoding) else { return nil }
        self.init(data: data)
    }

    init?(fromURL url: String) {
        guard let url = URL(string: url) else { return nil }
        guard let data = try? Data(contentsOf: url) else { return nil }
        self.init(data: data)
    }

    var jsonData: Data? {
        return try? JSONEncoder().encode(self)
    }

    var json: String? {
        guard let data = self.jsonData else { return nil }
        return String(data: data, encoding: .utf8)
    }
}

【问题讨论】:

  • SHA-256 不是加密算法。它是一种单向哈希算法。根据设计,没有有效的方法来反转 SHA-256 哈希以检索原始数据(如果有有效的方法,SHA-256 将不是加密哈希)。这里的“高效”并不意味着“快”。这意味着“比仅仅猜测每个可能的 URL 并查看它是否正确要好。”您想在这里通过加密实现什么目标?
  • @RobNapier 实际上我的问题与算法无关。认为它是 AES-256,而不是 SHA-256...

标签: ios json swift encryption decode


【解决方案1】:

如果我理解正确,您有一个字段 URL,您将在服务器端进行 SHA256 加密。 然后你会收到它在 json 中加密,你想在类实例中解密它。

如果是这样,只需查看文档:encoding and decoding custom types 并搜索标题:Encode and Decode Manually

第一个代码块是结构,第二个是自定义解析器,您可以在其中对字段进行 sha256 加密。

编辑:

不幸的是,我没有时间为您编写代码,但也许这个关于 Encodable 和编码密钥的更深入的教程会对您有所帮助(查找标题“手动编码和解码”):Tutorial Swift 4.0 Encodable

它的要点非常简单:您在可解码扩展中提供自己的解码逻辑。在这里,他们将宽度和高度分组在一个 Size 变量中:

  struct Photo
{
    var title: String
    var size: Size

    enum CodingKeys: String, CodingKey
    {
        case title = "name"
        case width
        case height
    }
}

extension Photo: Encodable
{
    func encode(to encoder: Encoder) throws
    {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(title, forKey: .title)
        try container.encode(size.width, forKey: .width)
        try container.encode(size.height, forKey: .height)
    }
}

extension Photo: Decodable
{
    init(from decoder: Decoder) throws
    {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        title = try values.decode(String.self, forKey: .title)
        let width = try values.decode(Double.self, forKey: .width)
        let height = try values.decode(Double.self, forKey: .height)
        size = Size(width: width, height: height)
    }
}

【讨论】:

  • 你能给我举个例子吗?我不明白我该如何实现它。假设我有一个名为“decryptMyString(getValue: String). 的函数
  • 我编辑了我的答案以添加一些虚拟代码和另一个教程的链接来帮助你。
  • 当您说“sha256 解密”时,您指的是什么?加密哈希没有反函数。
  • @RobNapier :你当然是对的 :) 我编辑了我的答案说“加密”,这更有意义:)
猜你喜欢
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多