我希望在iOS 4及更高版本的iOS应用程序中使用MD5或SHA-1.我使用CommonCrypto/CommonDigest.h中的CC_MD5()和CC_SHA1()函数.它似乎在运行iOS 4.1和iPhone 4.0模拟器的iPhone上运行良好,但我很担心,因为XCode 4.2附带的iOS 5 SDK中的函数声明如下:
extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_5_0);
extern unsigned char *CC_SHA1(const void *data, CC_LONG len, unsigned char *md)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_5_0);
Run Code Online (Sandbox Code Playgroud)
这似乎表明这些功能仅适用于iOS 5及更高版本.
这些功能是否允许在iOS 4应用程序中使用,如果是这样,是否有任何官方参考来记录这一事实?
我在Swift框架中使用CommonCrypto - 它已经运行了一年多了.
我使用了这里找到的解决方案:在Swift框架中导入CommonCrypto
具体来说,为了从Swift框架引用CommonCrypto,我不得不:
module.map
在CommonCrypto
我的框架的Xcode项目旁边的文件夹中创建一个文件.module.map
内容:
module CommonCrypto [system]
{
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/CommonCrypto/CommonCrypto.h"
link "CommonCrypto"
export *
}
Run Code Online (Sandbox Code Playgroud)
CommonCrypto
$(SDKROOT)/usr/lib/system
import CommonCrypto
这很好用; 有点复杂 - 但它奏效了.
但是,在Xcode 7.3 beta 1(7D111g)中,此技术不再有效.
它似乎libcommonCrypto.tbd
已从$(SDKROOT)/usr/lib/system
Xcode-beta.app中删除:我无法在iPhoneOS SDK文件夹结构下找到它.
所以我得到这些错误:
ld:警告:找不到选项'-L/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/usr/lib/system'ld的目录:ld:library找不到架构arm64 clang的-lCommonCrypto:错误:链接器命令失败,退出代码为1(使用-v查看调用)
如果疯狂的模块地图业务被更简单的东西取代,那将是很棒的.比如说,只是使用import CommonCrypto
在任何情况下,我不知道如何解决这个问题,所以任何帮助都表示赞赏.
如果解决方案与上一个问题中找到的解决方案大不相同,我在这里要求提出一个新问题,尽管我很欣赏这可能不合适.
我有一些数据,我正在SecKeyRawSign
使用Elliptic Curve私钥在iOS上签名.但是,使用Signature.verify()
返回验证Java中的数据false
数据是一个随机的64位整数,像这样分成字节
uint64_t nonce = (some 64 bit integer)
NSData *nonceData = [NSData dataWithBytes: &nonce length: sizeof(nonce)];
Run Code Online (Sandbox Code Playgroud)
根据该数据,我正在创建一个SHA256摘要
int digestLength = CC_SHA256_DIGEST_LENGTH;
uint8_t *digest = malloc(digestLength);
CC_SHA256(nonceData.bytes, (CC_LONG)nonceData.length, digest);
NSData *digestData = [NSData dataWithBytes:digest length:digestLength];
Run Code Online (Sandbox Code Playgroud)
然后使用私钥对其进行签名
size_t signedBufferSize = kMaxCipherBufferSize;
uint8_t *signedBuffer = malloc(kMaxCipherBufferSize);
OSStatus status = SecKeyRawSign(privateKeyRef,
kSecPaddingPKCS1SHA256,
(const uint8_t *)digestData.bytes,
digestData.length,
&signedBuffer[0],
&signedBufferSize);
NSData *signedData = nil;
if (status == errSecSuccess) {
signedData = [NSData dataWithBytes:signedBuffer length:signedBufferSize];
}
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好.
然后,在Java服务器中,我正在尝试验证签名数据
PublicKey publicKey …
Run Code Online (Sandbox Code Playgroud) 我有一个令人困惑的问题,解密使用CCCrypt的AES-CBC模式加密的文件和随机的16字节IV产生完全相同的输出,无论我传入相同的正确IV用于加密还是根本没有.
我的期望:使用NULL IV进行解密不应导致正确的解密.我观察到:使用NULL IV会产生与用于加密的IV相同的结果.
下面为了完整起见,这里是重要的代码片段,iv
以16字节安全随机化的NSData传递.
我在这里不理解什么?CCCrypt是否以某种方式从加密数据中找出IV本身?我在文档中找不到任何相关内容.
- (NSData *)encryptedDataForData:(NSData *)rawData
withKey:(NSData *)key
iv:(NSData *)iv
error:(NSError __autoreleasing**)error
{
size_t outLength;
NSMutableData *cipherData = [NSMutableData dataWithLength:rawData.length + kAlgorithmBlockSize];
CCCryptorStatus result = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCModeCBC,
key.bytes,
key.length,
iv.bytes,
rawData.bytes,
rawData.length,
cipherData.mutableBytes,
cipherData.length,
&outLength);
if (result == kCCSuccess) {
cipherData.length = outLength;
return cipherData;
} else {
return nil;
}
}
- (NSData *)decryptedDataForData:(NSData *)encryptedData withKey:(NSData *)key error:(NSError __autoreleasing**)error
{
size_t outLength;
NSMutableData *decryptedData = [NSMutableData dataWithLength:encryptedData.length];
// this line …
Run Code Online (Sandbox Code Playgroud) 我正在为大型视频文件创建MD5校验和.我目前正在使用代码:
extension NSData {
func MD5() -> NSString {
let digestLength = Int(CC_MD5_DIGEST_LENGTH)
let md5Buffer = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLength)
CC_MD5(bytes, CC_LONG(length), md5Buffer)
let output = NSMutableString(capacity: Int(CC_MD5_DIGEST_LENGTH * 2))
for i in 0..<digestLength {
output.appendFormat("%02x", md5Buffer[i])
}
return NSString(format: output)
}
}
Run Code Online (Sandbox Code Playgroud)
但这会产生一个内存缓冲区,对于大型视频文件来说并不理想.在Swift中有没有办法计算读取文件流的MD5校验和,因此内存占用量最小?
我试图为Apple的CommonCrypto库找到某种参考,因为显然Apple没有任何明显的链接,谷歌给出的那些已经过时了,如下所示:
有什么暗示吗?是否有更好的库可用于开发具有大量加密功能的应用程序?
谢谢.
我已经为一次性密码编写了一个小型库,我想通过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)
然后我使用这段代码来获取函数执行后的值: …
commoncrypto ×10
ios ×7
swift2 ×3
cryptography ×2
objective-c ×2
checksum ×1
cocoapods ×1
frameworks ×1
ios4 ×1
iphone ×1
java ×1
kotlin ×1
md5 ×1
openssl ×1
swift ×1
xcode7 ×1