如何在swift中将SHA256与salt(某些键)结合使用

如何在swift中将SHA256与salt(某些键)结合使用,swift,sha256,commoncrypto,Swift,Sha256,Commoncrypto,我发现我们可以用CommonCrypto散列一些字符串。 我看到了一些例子,但它们不使用盐。 如何将SHA256与盐结合使用?将您的indata与盐结合使用,然后运行哈希计算 func hash(input: String, salt: String) -> String { let toHash = input + salt // TODO: Calculate the SHA256 hash of "toHash" and return it // retur

我发现我们可以用CommonCrypto散列一些字符串。 我看到了一些例子,但它们不使用盐。
如何将SHA256与盐结合使用?

将您的indata与盐结合使用,然后运行哈希计算

func hash(input: String, salt: String) -> String {
    let toHash = input + salt

    // TODO: Calculate the SHA256 hash of "toHash" and return it
    // return sha256(toHash)

    // Return the input data and hash for now
    return toHash
}

print(hash("somedata", salt: "1m8f")) // Prints "somedata1m8f"

Swift 4的完整解决方案:

extension Data {

    var hexString: String {
        return map { String(format: "%02hhx", $0) }.joined()
    }

    var sha256: Data {
        var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
        self.withUnsafeBytes({
            _ = CC_SHA256($0, CC_LONG(self.count), &digest)
        })
        return Data(bytes: digest)
    }

}

extension String {

    func sha256(salt: String) -> Data {
        return (self + salt).data(using: .utf8)!.sha256
    }

}
例如:

let hash = "test".sha256(salt: "salt").hexString

是的,应该这样!大多数情况下,这是完全正确的,但有一个安全漏洞需要注意。如果输入和salt都可以是可变长度的,则可能会注入漏洞。例如,在这个方案中,如果salt是用户名,那么散列
abc
和用户名
dennis
与散列
abcd
和用户名
ennis
相同。这可以通过使用数据中不允许的字符分隔片段来解决(
\0
是一个常见的选择;我也使用
以方便使用,如果这是一个禁止的字符),或者通过确保盐的长度是固定的。