SETOCryptomatorCryptor 是一个 iOS 加密库,用于访问 Cryptomator 保险库。有关安全细节的更多信息,请访问docs.cryptomator.org。
要求
- iOS 8.0 或更高版本
- ARC 启用
安装
在您的应用程序中使用 SETOCryptomatorCryptor 的一种最简单的方法是通过 CocoaPods。
- 在项目的 Podfile 文件中添加以下行:
pod 'SETOCryptomatorCryptor', '~> 1.4.0'
- 在 Podfile 文件夹目录下运行命令
pod install
。
审计
发现 | 注释 |
---|---|
1u1-22-001 | 此问题与 cryptolib、cryptofs 和 siv-mode 相关。 |
1u1-22-002 | 此问题与 siv-mode 相关。 |
使用
SETOMasterKey
《SETOMasterKey》是一个只包含AES加密/解密和MAC身份验证密钥材料的类。
构造函数
这将使用安全的随机字节数据创建一个新的主密钥。
SETOMasterKey *masterKey = [[SETOMasterKey alloc] init];
由于随机数生成将受益于UI交互,您应该从后台线程调用构造函数。
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
SETOMasterKey *masterKey = [[SETOMasterKey alloc] init];
dispatch_async(dispatch_get_main_queue(), ^{
// do the rest here
});
});
另一种方法是使用原始字节数据创建主密钥。
NSData *aesMasterKey = ...;
NSData *macMasterKey = ...;
SETOMasterKey *masterKey = [[SETOMasterKey alloc] initWithAESMasterKey:aesMasterKey macMasterKey:macMasterKey];
SETOMasterKeyFile
《SETOMasterKeyFile》是主密钥文件的表示形式。有了它,您可以解锁主密钥文件(并获取《SETOMasterKey》)或锁定主密钥文件(并将其序列化为JSON)。
构造函数
使用从JSON数据提供的功能创建主密钥文件。
NSData *jsonData = ...;
SETOMasterKeyFile *masterkeyFile = [[SETOMasterKeyFile alloc] initWithContentFromJSONData:jsonData];
解锁
当你拥有主密钥文件时,你可以尝试进行解锁。如果成功,它将解包存储的加密和MAC密钥到主密钥中,这可以用于密码器。
SETOMasterKeyFile *masterkeyFile = ...;
NSString *passphrase = ...;
NSData *pepper = ...; // optional
NSInteger expectedVaultVersion = ...; // use NSNotFound if a version check should be skipped
NSError *error;
SETOMasterKey *masterKey = [masterkeyFile unlockWithPassphrase:passphrase pepper:pepper expectedVaultVersion:expectedVaultVersion error:&error];
锁定
为了持久化主密钥,使用此方法导出其加密/包装后的主密钥和其他元数据作为JSON数据。
SETOMasterKey *masterKey = ...;
NSInteger vaultVersion = ...;
NSString *passphrase = ...;
NSData *pepper = ...; // optional
uint64_t scryptCostParam = ...; // use kSETOMasterKeyFileDefaultScryptCostParam if you are not sure
NSError *error;
NSData *jsonData = [SETOMasterKeyFile lockMasterKey:masterKey withVaultVersion:vaultVersion passphrase:passphrase pepper:pepper scryptCostParam:scryptCostParam error:&error];
您应该从后台线程调用锁定方法,因为随机数生成将受益于UI交互。
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
SETOMasterKey *masterKey = ...;
NSInteger vaultVersion = ...;
NSString *passphrase = ...;
NSData *pepper = ...; // optional
uint64_t scryptCostParam = ...; // use kSETOMasterKeyFileDefaultScryptCostParam if you are not sure
NSError *error;
NSData *jsonData = [SETOMasterKeyFile lockMasterKey:masterKey withVaultVersion:vaultVersion passphrase:passphrase pepper:pepper scryptCostParam:scryptCostParam error:&error];
dispatch_async(dispatch_get_main_queue(), ^{
// do the rest here
});
});
SETOCryptorProvider
《SETOCryptor》是一个创建《SETOCryptor》对象的工厂。始终使用这个工厂创建《SETOCryptor》实例。
工厂
SETOMasterKey *masterKey = ...;
NSError *error;
SETOCryptor *cryptor = [SETOCryptorProvider cryptorWithMasterKey:masterKey forVaultVersion:7 error:&error];
SETOCryptor
《SETOCryptor》是 Cryptomator 保险箱上加密操作的核心类。这是一个抽象类,因此你应该使用《SETOCryptorProvider》来创建《SETOCryptor》实例。
目录ID加密
为了确定加密后的目录路径,加密目录ID。
SETOCryptor *cryptor = ...;
NSString *directoryId = ...;
NSString *encryptedDirectoryId = [cryptor encryptDirectoryId:directoryId];
文件名加密和解密
通过提供目录ID来加密和解密文件名。
SETOCryptor *cryptor = ...;
NSString *filename = ...;
NSString *directoryId = ...;
NSString *encryptedFilename = [cryptor encryptFilename:filename insideDirectoryWithId:directoryId];
NSString *decryptedFilename = [cryptor decryptFilename:encryptedFilename insideDirectoryWithId:directoryId];
文件内容身份验证
验证文件内容以确保其完整性。
SETOCryptor *cryptor = ...;
NSString *ciphertextFilePath = ...;
[cryptor authenticateFileAtPath:ciphertextFilePath callback:^(NSError *error) {
if (error) {
NSLog(@"Authentication Error: %@", error);
} else {
NSLog(@"Authentication Success");
}
} progress:^(CGFloat progress) {
NSLog(@"Authentication Progress: %.2f", progress);
}];
文件内容加密
通过路径加密文件内容。
SETOCryptor *cryptor = ...;
NSString *cleartextFilePath = ...;
NSString *ciphertextFilePath = ...;
[cryptor encryptFileAtPath:cleartextFilePath toPath:ciphertextFilePath callback:^(NSError *error) {
if (error) {
NSLog(@"Encryption Error: %@", error);
} else {
NSLog(@"Encryption Success");
}
} progress:^(CGFloat progress) {
NSLog(@"Encryption Progress: %.2f", progress);
}];
文件内容解密
通过路径解密文件内容。
SETOCryptor *cryptor = ...;
NSString *ciphertextFilePath = ...;
NSString *cleartextFilePath = ...;
[cryptor decryptFileAtPath:ciphertextFilePath toPath:cleartextFilePath callback:^(NSError *error) {
if (error) {
NSLog(@"Decryption Error: %@", error);
} else {
NSLog(@"Decryption Success");
}
} progress:^(CGFloat progress) {
NSLog(@"Decryption Progress: %.2f", progress);
}];
文件大小计算
从存储库版本5开始,您可以在O(1)时间内确定明文和密文的大小。在版本5之前的存储库中读取文件大小从理论上来说是可能的,但此库不支持。
SETOCryptor *cryptor = ...;
NSUInteger size = ...;
NSUInteger ciphertextSize = [cryptor ciphertextSizeFromCleartextSize:size];
NSUInteger cleartextSize = [cryptor cleartextSizeFromCiphertextSize:ciphertextSize];
SETOAsyncCryptor
SETOAsyncCryptor
是一个 SETOCryptor
装饰器,用于异步运行文件内容加密和解密操作。它在处理大文件时不会阻塞主线程,非常有用。
使用 initWithCryptor:queue:
创建和初始化 SETOAsyncCryptor
以指定一个分发队列。如果您使用便利初始化器 initWithCryptor:
,将创建并使用一个序列队列(效用 QoS 类)。
为 Cryptomator 做出贡献
请阅读我们的贡献指南,如果您想报告一个错误、提问或帮助我们进行编码。
行为准则
帮助我们保持Cryptomator的开放和包容。请阅读并遵守我们的行为准则。
许可证
在AGPLv3下分发。有关更多信息,请参阅LICENSE文件。