我已经为一次性密码编写了一个小型库,我想通过CocoaPods使它可用,但我在pod规范验证中失败了.
- > OTPGenerator(1.0) - ERROR | [iOS]返回失败的退出代码.您可以使用
--verbose
更多信息. - 错误| .../OTPGenerator/OTPGenerator/HOTPGenerator.swift:19:8:错误:没有这样的模块'CommonCrypto'
在XCode中一切正常,示例项目编译无需额外配置.我CommonCrypto
在项目中添加了虚拟框架,并使实际框架依赖于它.
有没有办法让pod规格可见?我尝试了多种方法,但我总是遇到同样的错误.
源代码可在此处获得:https://github.com/codewise/ios-otp-generators.
简单的问题:是否有人设法使用CommonCrypto
框架而不是执行本地收据验证OpenSSL
如果是 - 是否有任何示例代码如何做到这一点?
那么,用框架替换OpenSSL
Apple 文档(https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html)中的所有相关内容CommonCrypto
?
一些看起来像解决方案的东西OSX
存在于https://gist.github.com/sazameki/3026845但我想知道是否有类似的东西可用于iOS
.
在此先感谢您提供任何类型的答案或建议。
我正在尝试使用CommonCrypto在Swift 2中使用PBKDF2对密码进行哈希处理,因为它的高性能以及它是开源的
我已经设法使用模块映射在Swift中使用CommonCrypto,但是有人可以告诉我使用CommonCrypto在Swift 2中使用PBKDF2进行哈希处理的代码
我正在针对 iOS 的 Kotlin 多平台项目中研究 AES256 加密算法。
我检查了一些在纯 Kotlin 中实现这一点的现有库(例如krypto),但它们都不符合我对其余代码的要求(它们已经在 JVM 和 JS 中实现,因此无法更改) .
来自 iOS 背景,我决定使用CommonCrypto
. 我从这里改编并移植了代码,但我坚持如何ULong
通过引用传递CCCrypt
函数并稍后检索其值。
我非常仔细地阅读了关于C Interop和Objective-C Interop的 Kotlin 文档,但我找不到任何可以解释如何处理我的案例的示例。
特别是,我的问题是numBytesEncrypted
变量(见下面的代码)。我需要通过引用CCCrypt
函数来传递它,然后读取它的值以NSData
使用正确的长度实例化结果。在 Objective-C/Swift 中,我会&
在调用函数时为变量加上前缀。
但是,Kotlin 不支持&
运算符。如果我从文档中理解正确,那么 Native 中的替换是CValueRef
( docs ),所以我使用cValue
速记来获取正确类型的引用(应该是size_t
,又名。ULong
)。
我试图以CValueRef
两种方式实例化,就类型检查而言,这两种方式似乎都有效:
val numBytesEncrypted = cValue<ULongVar>()
// or
val numBytesEncrypted = cValue<ULongVarOf<size_t>>()
Run Code Online (Sandbox Code Playgroud)
然后我使用这段代码来获取函数执行后的值: …
我的理解是,在 OSX 10.7 中不推荐使用 OpenSSL 以支持 Common Crypto,但我似乎无法很好地处理如何从 OpenSSL 代码转换到 Common Crypto 代码。特别是,我正在查看带有 ValidateStoreReceipt 的 App Store 收据验证。我首先尝试找到一种方法来获取 PKCS#7 容器的内容,这似乎是 中的第一步dictionaryWithAppStoreReceipt
,但我找不到任何有关如何执行此操作的文档。
是否可以重写此代码以便不依赖于 OpenSSL?如果是这样,如何?是否有我错过的文档或教程?
我正在尝试在我的应用程序中编写密码加密功能,遵循本文.
我编写了一个运行该CCCalibratePBKDF
函数并输出轮数的函数.
const uint32_t oneSecond = 1000;
uint rounds = CCCalibratePBKDF(kCCPBKDF2,
predictedPasswordLength,
predictedSaltLength,
kCCPRFHmacAlgSHA256,
kCCKeySizeAES128,
oneSecond);
Run Code Online (Sandbox Code Playgroud)
这很有效,但是当我尝试实现下一部分时,一切都会出错.
我可以开始编写CCKeyDerivationPBKDF
函数调用,它会自动完成函数和所有参数.当我通过填充它所有参数也自动完成.
- (NSData *)authenticationDataForPassword: (NSString *)password salt: (NSData *)salt rounds: (uint) rounds
{
const NSString *plainData = @"Fuzzy Aliens";
uint8_t key[kCCKeySizeAES128] = {0};
int keyDerivationResult = CCKeyDerivationPBKDF(kCCPBKDF2,
[password UTF8String],
[password lengthOfBytesUsingEncoding: NSUTF8StringEncoding],
[salt bytes],
[salt length],
kCCPRFHmacAlgSHA256,
rounds,
key,
kCCKeySizeAES128);
if (keyDerivationResult == kCCParamError) {
//you shouldn't get here with the parameters as above
return nil;
} …
Run Code Online (Sandbox Code Playgroud) 我有一个加密的数据流(AES 128、CBC、PKCS7),我正在尝试在它到达时对其进行解密。有时我会得到一个长度为 334 的数据包,然后我尝试对其进行解密。当我在 iPhone 5 上执行此操作时,它会返回kCCBufferTooSmall
(预计非 mod 16 数据)。然而,当我在 iPhone 3GS 上有同样的东西时,它会返回kCCSuccess
并给我一个部分解密的流(它给我的 333 的最后十个字节左右是假的 - 空终止符和随机数据)。
两台设备都是 iOS 6.1.2。该应用程序是使用设置为最新 SDK (6.1) 的基本 SDK 构建的,部署目标为 iOS 5.0。
我创建了以下测试用例,它也出现了这个问题:
+ (void)decryptionTest {
NSData *data = [NSMutableData dataWithLength:334]; // 334 % 16 = 14
NSData *key = [NSMutableData dataWithLength:kCCKeySizeAES128];
NSData *iv = [NSMutableData dataWithLength:kCCBlockSizeAES128];
size_t outLength = 0;
NSMutableData *cipherData = [NSMutableData dataWithLength:data.length];
CCCryptorStatus result = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
key.bytes,
key.length,
iv.bytes,
data.bytes,
data.length,
cipherData.mutableBytes,
cipherData.length,
&outLength);
NSLog(@"result …
Run Code Online (Sandbox Code Playgroud) 这让我很难过 - 以下代码使用SpongyCastle的Android加密/解密 - 我正在尝试为iOS实现跨平台加密/解密.
下面的代码(来自Android)使用PKCS7Padding处理AES 128bit CBC,使用提供的salt和密码,salt存储在mysql数据库中,密码由最终用户提供,以下代码改编自此kelhoer回答.
我之所以使用AES128bit是因为AES256在iOS 4+中不可用,它是在iOS5 +中引入的,并且不得不使用脚趾openssl
来生成派生密钥和初始化矢量(iv),因为学到苹果公司拒绝它是很冒险的与openssl库静态链接的应用程序.
由于该平台基于iOS 4.2+,因此使用捆绑和静态链接openssl库似乎过度杀死并且最好使用CommonCryptor库.
这是使用Spongycastle代码的Android版本:
private static void encrypt(InputStream fin,
OutputStream fout,
String password,
byte[] bSalt) {
try {
PKCS12ParametersGenerator pGen = new PKCS12ParametersGenerator(
new SHA256Digest()
);
char[] passwordChars = password.toCharArray();
final byte[] pkcs12PasswordBytes =
PBEParametersGenerator.PKCS12PasswordToBytes(passwordChars);
pGen.init(pkcs12PasswordBytes, bSalt, ITERATIONS);
CBCBlockCipher aesCBC = new CBCBlockCipher(new AESEngine());
ParametersWithIV aesCBCParams =
(ParametersWithIV) pGen.generateDerivedParameters(128, 128);
aesCBC.init(true, aesCBCParams);
PaddedBufferedBlockCipher aesCipher =
new PaddedBufferedBlockCipher(aesCBC, new PKCS7Padding());
aesCipher.init(true, aesCBCParams);
byte[] buf = …
Run Code Online (Sandbox Code Playgroud) 我有许多文件将存在于服务器上.用户可以在设备上创建这些类型的文件(plist),然后将其上传到所述服务器(CloudKit).我想通过内容使它们独一无二(唯一的方法应该适应创建日期的变化).我的理解是我应该散列这些文件以获取它们的唯一文件名.我的问题是:
非常感谢!
指导是在桥接头中使用#import"CommonCrypto/CommonCrypto.h".这是来自于swift中的SHA256的问题.
但是,当我使用Andi和Graham给出的答案时,Xcode仍抱怨"使用未解析的标识符CC_SHA256_DIGEST_LENGTH ......"
我在想我犯了两个错误之一:(a)我遗漏了没有连接标题并正确导入的东西.即我没有正确设置桥接头.我想知道如何包含库并正确创建桥接头的明确步骤.或者(b)默认情况下不包含库,我实际上需要先下载它并在本地存储才能使用它.我喜欢这方面的指示.
谢谢.
commoncrypto ×10
ios ×7
iphone ×2
objective-c ×2
openssl ×2
swift ×2
swift2 ×2
android ×1
cocoapods ×1
encryption ×1
hash ×1
kotlin ×1
macos ×1
osx-lion ×1
security ×1
spongycastle ×1