- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我的java代码。现在我想在 Objective-C 中实现相同的功能。
int dkLen = 16;
int rounds = 1000;
PBEKeySpec keySpec = new PBEKeySpec(hashKey.toCharArray(),salt.getBytes(), rounds, dkLen * 8);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
return factory.generateSecret(keySpec).getEncoded();
这是我的 iOS 实现
- (void)getHashKey {
NSString *hash_key=@"MY_HASHKEY";
NSString *saltKey = @"MY_SALTKEY";
int dkLen = 16;
NSData *keyData = [hash_key dataUsingEncoding:NSUTF8StringEncoding];
NSData *salt = [saltKey dataUsingEncoding:NSUTF8StringEncoding];
uint rounds = 1000;
uint keySize = kCCKeySizeAES128;
NSMutableData *derivedKey = [NSMutableData dataWithLength:keySize];
CCKeyDerivationPBKDF(kCCPBKDF2, // algorithm
keyData.bytes, // password
keyData.length, // passwordLength
salt.bytes, // salt
salt.length, // saltLen
kCCPRFHmacAlgSHA1, // PRF
rounds, // rounds
derivedKey.mutableBytes, // derivedKey
dkLen*8); // derivedKeyLen
NSString *myString = [[NSString alloc] initWithData:derivedKey encoding:NSASCIIStringEncoding];
NSLog(@"derivedKey: %@", myString);
}
我在 iOS 中使用的算法有什么问题吗
最佳答案
使用 Common Crypto CCKeyDerivationPBKDF
函数和选项 kCCPRFHmacAlgSHA1
。
注意 PBEKeySpec
keyLength
以位为单位,CCKeyDerivationPBKDF
derivedKeyLen
以字节为单位。
要获得更详细的答案,请提供所有输入(hashKey、salt)和十六进制转储格式的输出以及轮数、以字节为单位的输出长度。
查看此 SO answer示例代码。
Update for revised question code:
CCKeyDerivationPBKDF
返回 8 位数据字节,这些字节本质上不是字符,许多字节即使强制进入 NSASCIIStringEncoding
也不可打印。即使没有返回错误,也强制使用 NSASCIIStringEncoding
是不正确且无用的。而是使用返回的 NSData
或转换为 Base64 或 HexASCII 编码。
改变
NSString *myString = [[NSString alloc] initWithData:derivedKey encoding:NSASCIIStringEncoding];
Output: A´Öº÷"ùïó
到
NSString * myString = [derivedKey base64EncodedStringWithOptions:0];
Output: QbTWgbr3FSL57/MfBQAz4A==
注意:1000 发通常被认为是不够的,应该使用 10,000 到 100,000 范围内的东西。
iPhone 6S 上的时间:
rounds seconds1000 0.003 10000 0.032 100000 0.309 1000000 3.047
关于objective-c - 在 IOS 中实现 PBEKeySpec 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33315235/
我想知道当我使用 PBEKeySpec 创建安全密码时如何或是否应该测试 .clearPassword()?我可以以某种方式查看 .clearPassword() 之后我的内部副本是否仍然存在吗? 最
我以前从未使用过 C++,但现在我需要将此功能迁移到 C++: public static byte[] getSafeKey(String key, byte[] initVector) {
我正在使用以下代码,以便为提供的密码生成哈希值: public static SecretKey generateKey( String passphraseOrPin ) throws NoSuc
使用相同的 IV、key、iteration 和 salt 作为输入,每次生成的 PBEKeySpec 是否都相同?即: SecretKeyFactory factory = SecretKeyFac
我想知道是否有办法将 PBEKeySpec 与字节数组参数一起使用。 请找到以下文档的链接: http://docs.oracle.com/javase/1.7/docs/api/javax/cryp
http://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/PBEKeySpec.html 盐、迭代次数和 key 长度是可选参数。如果未指定
如果我使用安全的随 secret 码作为 PBEKeySpec 的输入,它是否会增加迭代多次并添加盐的值(value)?它不会因此而变得更加随机,对吗? 最佳答案 如果密码是随机字节序列且长度正确,则
深入研究 java 加密和散列世界,我看到了 PBEKeySpec 类的构造函数示例,该类具有 iterationCount 和 keyLength 的各种值> 参数。似乎没有什么可以解释这些参数的影
我目前正在尝试加密和解密 java 字符串。为此,我编写了以下 2 种方法: public static String AESencryptString(String clearStr) throws
如果有人能给我一些指点:我有一个由 PBEKeySpec 生成的 KeySpec: KeySpec spec = new PBEKeySpec(password.toCharArray(), "SAL
这是我的java代码。现在我想在 Objective-C 中实现相同的功能。 int dkLen = 16; int rounds = 1000; PBEKeySpec keySpec = new P
我正在开发一些可互操作的代码,用于在 Java 和 Node.js 之间加密/解密字符串,并设法让 Node.js 解密 Java 加密的内容,这是成功解密的最后一部分: key 。 要在 Java
我是一名优秀的程序员,十分优秀!