CryptoLib Swift
这个库包含了 Cryptomator 在 iOS 中使用到的所有加密函数。本项目的目的是提供一个独立的轻量级库,拥有自己的发布周期,也可以用于其他项目。
有关 Cryptomator 加密方案的更多信息,请访问 docs.cryptomator.org 上的安全架构页面。
要求
- iOS 9.0 或更高版本
- macOS 10.12 或更高版本
安装
Swift 包管理器
您可以使用 Swift 包管理器。
.package(url: "https://github.com/cryptomator/cryptolib-swift.git", .upToNextMinor(from: "1.0.0"))
CocoaPods
您可以使用CocoaPods。
pod 'CryptomatorCryptoLib', '~> 1.0.0'
使用方法
主密钥
Masterkey
是一个只包含AES加密/解密和MAC身份验证密钥材料的类。
工厂
这将会创建一个新的主密钥,并带有安全的随机字节。
let masterkey = try Masterkey.createNew()
另一种创建主密钥的方式是从原始字节创建。
let aesMasterKey = ...
let macMasterKey = ...
let masterkey = Masterkey.createFromRaw(aesMasterKey: aesMasterKey, macMasterKey: macMasterKey)
主密钥文件
MasterkeyFile
表示主密钥文件。使用它,您可以解锁主密钥文件(并获得一个 Masterkey
),锁定主密钥文件(并以JSON序列化),或更改密码短语。
工厂
创建一个具有从URL提供的或从JSON数据提供的内容的主密钥文件。
let url = ...
let masterkeyFile = try MasterkeyFile.withContentFromURL(url: url)
或者从JSON数据
let data = ...
let masterkeyFile = try MasterkeyFile.withContentFromData(data: data)
解锁
当您拥有主密钥文件时,您可以尝试解锁。如果成功,它将解密存储的加密密钥和MAC密钥到主密钥中,这可以用于加密器。
let masterkeyFile = ...
let passphrase = ...
let pepper = ... // optional
let masterkey = try masterkeyFile.unlock(passphrase: passphrase, pepper: pepper)
锁定
为了持久化主密钥,请使用此方法导出其加密/包装的主密钥和其他元数据为JSON数据。
let masterkey = ...
let vaultVersion = ...
let passphrase = ...
let pepper = ... // optional
let scryptCostParam = ... // optional
let data = try MasterkeyFile.lock(masterkey: masterkey, vaultVersion: vaultVersion, passphrase: passphrase, pepper: pepper, scryptCostParam: scryptCostParam)
更改密语
可以使用新的密语重新加密主密钥。
let masterkeyFileData = ...
let oldPassphrase = ...
let newPassphrase = ...
let pepper = ... // optional
let scryptCostParam = ... // optional
try MasterkeyFile.changePassphrase(masterkeyFileData: masterkeyFileData, oldPassphrase: oldPassphrase, newPassphrase: newPassphrase, pepper: pepper, scryptCostParam: scryptCostParam)
加密器
加密器
是加密操作Cryptomator金库的核心类。
构造函数
通过提供主密钥来创建加密器。
let masterkey = ...
let cryptor = Cryptor(masterkey: masterkey)
路径加密和解密
通过加密目录ID来确定加密后的目录URL。
let cryptor = ...
let dirId = ...
let encryptedDirId = try cryptor.encryptDirId(dirId)
通过提供一个目录ID来加密和解密文件名。
let cryptor = ...
let filename = ...
let dirId = ...
let ciphertextName = try cryptor.encryptFileName(filename, dirId: dirId)
let cleartextName = try cryptor.decryptFileName(ciphertextName, dirId: dirId)
文件内容的加密和解密
通过URL对文件内容进行加密和解密。这些方法支持隐式进度合成。
let cryptor = ...
let fileURL = ...
let ciphertextURL = ...
let cleartextURL = ...
try cryptor.encryptContent(from: fileURL, to: ciphertextURL)
try cryptor.decryptContent(from: ciphertextURL, to: cleartextURL)
文件大小计算
以O(1)的时间复杂度确定明文和密文的大小。
let cryptor = ...
let size = ...
let ciphertextSize = cryptor.calculateCiphertextSize(size)
let cleartextSize = try cryptor.calculateCleartextSize(ciphertextSize)
为CryptoLib Swift项目做贡献
如果您想报告一个错误、提出一个问题或帮助我们进行编码,请阅读我们的
贡献指南。
通常,以下偏好被用于选择加密原语的实现
- Apple Swift Crypto (HMAC)
- Apple CommonCrypto (AES-CTR, RFC 3394 密钥派生)
行为准则
帮助我们维护Cryptomator的开放性和包容性。请阅读并遵守我们的
行为准则。
许可
根据AGPLv3分发。有关更多信息,请参阅LICENSE文件。