You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux(Ubuntu)Swift中使用CommonCrypto获取SHA256遇库未找到问题

在Ubuntu 16.04上用Swift PM构建SHA256代码的CommonCrypto问题解决方案

嘿,我来帮你解决这个在Ubuntu 16.04上用Swift Package Manager构建SHA256代码时遇到的CommonCrypto问题——这确实是Linux和macOS Swift环境之间的典型差异点,咱们一步步来梳理:

CommonCrypto在Linux Swift上的支持情况

首先明确一点:CommonCrypto是苹果专属的加密库,Linux Swift环境下并不自带这个库,所以你会遇到找不到CommonCrypto/CommonHMAC.h的编译错误。这也是为什么在macOS上能正常运行的代码,放到Linux上就跑不起来了。

关于“指定路径”的可行性(不推荐)

虽然社区有一些CommonCrypto的Linux移植版本,但手动编译并配置路径的过程非常繁琐,而且在Ubuntu 16.04这种较老的系统上很容易遇到依赖兼容问题,稳定性也没法保证。所以并不推荐这种绕路的方式。

Linux Swift中获取SHA256的推荐方案

这里给你两个靠谱的跨平台/原生解决方案:

方案1:使用苹果官方的Swift Crypto库(优先推荐)

Swift Crypto是苹果官方维护的跨平台加密库,完全兼容Linux,API设计和CommonCrypto很相似,上手成本低,而且后续更新有保障。

  • 第一步,在你的Package.swift中添加依赖:
dependencies: [
    .package(url: "https://github.com/apple/swift-crypto.git", from: "2.0.0")
],
targets: [
    .target(
        name: "YourTargetName", // 替换成你的目标模块名
        dependencies: [.product(name: "Crypto", package: "swift-crypto")]
    )
]
  • 第二步,修改你的SHA256实现代码:
import Crypto

static func sha256(string: String) -> String? {
    guard let data = string.data(using: .utf8) else { return nil }
    let hash = SHA256.hash(data: data)
    let result = Data(hash)
    return result.base64EncodedString()
}

方案2:使用Ubuntu系统自带的OpenSSL

Ubuntu 16.04默认自带OpenSSL,你可以通过Swift的C交互能力直接调用它的加密API,不需要额外引入第三方依赖。

  • 第一步,确保系统安装了OpenSSL开发包:
sudo apt-get install libssl-dev
  • 第二步,在Package.swift中配置链接库:
targets: [
    .target(
        name: "YourTargetName", // 替换成你的目标模块名
        linkerSettings: [.linkedLibrary("ssl"), .linkedLibrary("crypto")]
    )
]
  • 第三步,修改你的SHA256实现代码:
import Foundation
#if os(Linux)
import Copenssl
#endif

static func sha256(string: String) -> String? {
    guard let data = string.data(using: .utf8) else { return nil }
    
    var hash = [UInt8](repeating: 0, count: Int(SHA256_DIGEST_LENGTH))
    data.withUnsafeBytes { buffer in
        _ = SHA256(buffer.baseAddress, CC_LONG(data.count), &hash)
    }
    
    let result = Data(bytes: hash)
    return result.base64EncodedString()
}

内容的提问来源于stack exchange,提问作者aepryus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:17:52