SETOCryptomatorCryptor 1.6.3

SETOCryptomatorCryptor 1.6.3

测试测试
Lang语言 Obj-CObjective C
许可证 AGPL-3.0
发布上次发布2021年2月

Tobias Hagemann 维护。



 
依赖关系
Base32~> 1.1.0
KZPropertyMapper~> 2.9.0
OpenSSL-Universal~> 1.0.0
 

  • Tobias Hagemann 和 Sebastian Stenzel

SETOCryptomatorCryptor

Cocoapods Compatible Platform Twitter

SETOCryptomatorCryptor 是一个 iOS 加密库,用于访问 Cryptomator 保险库。有关安全细节的更多信息,请访问docs.cryptomator.org

要求

  • iOS 8.0 或更高版本
  • ARC 启用

安装

在您的应用程序中使用 SETOCryptomatorCryptor 的一种最简单的方法是通过 CocoaPods

  1. 在项目的 Podfile 文件中添加以下行:pod 'SETOCryptomatorCryptor', '~> 1.4.0'
  2. 在 Podfile 文件夹目录下运行命令 pod install

审计

发现 注释
1u1-22-001 此问题与 cryptolibcryptofssiv-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文件。