安全服务API似乎不允许我直接计算哈希.有很多公共领域和自由许可的版本可用,但我宁愿使用系统库实现,如果可能的话.
可以通过NSData或普通指针访问数据.
哈希的加密强度对我来说很重要.SHA-256是可接受的最小散列大小.
我正在构建一个社交媒体应用程序,我想帮助在Swift中将密码字符串编码为SHA512.我在GitHub上找到了CryptoSwift库,但我很难将它加载到我的Swift项目中并将其链接到我的项目文件.有谁知道如何相对容易地完成这个?先谢谢你,凯尔
我有许多文件将存在于服务器上.用户可以在设备上创建这些类型的文件(plist),然后将其上传到所述服务器(CloudKit).我想通过内容使它们独一无二(唯一的方法应该适应创建日期的变化).我的理解是我应该散列这些文件以获取它们的唯一文件名.我的问题是:
非常感谢!
指导是在桥接头中使用#import"CommonCrypto/CommonCrypto.h".这是来自于swift中的SHA256的问题.
但是,当我使用Andi和Graham给出的答案时,Xcode仍抱怨"使用未解析的标识符CC_SHA256_DIGEST_LENGTH ......"
我在想我犯了两个错误之一:(a)我遗漏了没有连接标题并正确导入的东西.即我没有正确设置桥接头.我想知道如何包含库并正确创建桥接头的明确步骤.或者(b)默认情况下不包含库,我实际上需要先下载它并在本地存储才能使用它.我喜欢这方面的指示.
谢谢.
我做了一些环顾四周,但我只能找到使用Objective-C创建SHA256哈希的示例.有没有办法只用Swift4做到这一点?
func SHA256() -> String {
let data = self.data(using: String.Encoding.utf8)
let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH))
CC_SHA256((data! as NSData).bytes, CC_LONG(data!.count), UnsafeMutablePointer(res!.mutableBytes))
let hashedString = "\(res!)".replacingOccurrences(of: "", with: "").replacingOccurrences(of: " ", with: "")
let badchar: CharacterSet = CharacterSet(charactersIn: "\"<\",\">\"")
let cleanedstring: String = (hashedString.components(separatedBy: badchar) as NSArray).componentsJoined(by: "")
return cleanedstring
}
Run Code Online (Sandbox Code Playgroud)
我收到以下代码的弃用警告,
_ = data.withUnsafeBytes {
_ = CC_SHA256($0, CC_LONG(data.count), &digest)
}
Run Code Online (Sandbox Code Playgroud)
'withUnsafeBytes' 已弃用:
withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R改用
我该如何处理这个问题?
根据 Martin 的建议,我使用了下面的Swift-5代码,
func sha256(data : Data) -> Data {
var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
_ = CC_SHA256($0.baseAddress, CC_LONG(data.count), &hash)
}
return Data(hash)
}
Run Code Online (Sandbox Code Playgroud)
这甚至会给编译器带来错误,
类型“UnsafePointer<_>”的值没有成员“baseAddress”
swift ×4
ios ×3
sha256 ×3
commoncrypto ×2
hash ×2
cryptoswift ×1
deprecated ×1
objective-c ×1
security ×1
sha512 ×1
swift3 ×1
swift4 ×1
xcode ×1
xcode9 ×1