我试图生成SHA256在iOS使用奥术库与以下数据:
字符串:Amount=50
键:
71DD0F73AFFB47825FF9864DDE95F3B
结果是
409dc622b3bef5c9fc46e45c3210111fcb4536d3a55833316fe0dc8154b3ea34
我认为这是正确的。但是,Windows对应程序正在使用以下代码生成SHA256:
Windows Phone Source Code:
public static string HmacSha256(string secretKey, string value)
{
var msg = CryptographicBuffer.ConvertStringToBinary(value, BinaryStringEncoding.Utf8);
byte[] convertedHash = new byte[secretKey.Length / 2];
for (int i = 0; i < secretKey.Length / 2; i++)
{
convertedHash[i] = (byte)Int32.Parse(secretKey.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber);
}
// Create HMAC.
var objMacProv = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256);
CryptographicHash hash = objMacProv.CreateHash(convertedHash.AsBuffer());
hash.Append(msg);
return CryptographicBuffer.EncodeToHexString(hash.GetValueAndReset());
}
结果是:
94a20ca39c8487c7763823ec9c918d9e38ae83cb741439f6d129bcdef9edba73
,这与我得到的不同。有人能帮我一下吗?让我知道上面的代码在做什么,我如何在iOS中复制它。
编辑:
iOS Source code
let key = self.md5(string: "71DD0F73AFFBB47825FF9864DDE95F3B")
let hash = HMAC.SHA256(str, key: key)
html prettyprint-override">#import <CommonCrypto/CommonHMAC.h>
+ (NSString *)hmacSHA256EncryptString{
NSString * parameterSecret = @"input secret key";
NSString *plainString = @"input encrypt content string";
const char *secretKey = [parameterSecret cStringUsingEncoding:NSUTF8StringEncoding];
const char *plainData = [plainString cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, secretKey, strlen(secretKey), plainData, strlen(plainData), cHMAC);
NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
const unsigned char *bufferChar = (const unsigned char *)[HMACData bytes];
NSMutableString *hmacString = [NSMutableString stringWithCapacity:HMACData.length * 2];
for (int i = 0; i < HMACData.length; ++i){
[hmacString appendFormat:@"%02x", bufferChar[i]];
}
return hmacString;
}
Windows代码接受字符串,将其解释为十六进制数,并将每次两个字符转换为一个字节。
你的Mac代码最喜欢的是字符串。由于密钥以“71”开头,windows代码将其作为一个单字节,值为0x71=129,Mac代码将其作为两个字节,值为“7”=55,“1”=49。
你所需要做的就是在Mac上转换字节,就像在Windows上一样。你可能不得不做一些不可思议的事情,看看Mac库的源代码,看看它是如何进行实际的哈希计算的。
这里的关键是您需要将您的秘密(十六进制字符串)转换为NSData。换句话说,NSData
字节流将看起来像秘密。
这应该满足您的要求:
// Hex string to NSData conversion from here http://stackoverflow.com/questions/7317860/converting-hex-nsstring-to-nsdata
NSString *secret = @"71DD0F73AFFBB47825FF9864DDE95F3B";
NSData *dataIn = [@"Amount=50&BillerID=59&ChannelID=2&Context=34|check|test&ReturnURL=https://uat.myfatoora.com/ReceiptPOC.aspx&TxnRefNum=000000000020003&UserName=DCS" dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
secret = [secret stringByReplacingOccurrencesOfString:@" " withString:@""];
NSMutableData *secretData = [[NSMutableData alloc] init];
unsigned char whole_byte;
char byte_chars[3] = {'\0','\0','\0'};
int i;
for (i=0; i < [secret length]/2; i++) {
byte_chars[0] = [secret characterAtIndex:i*2];
byte_chars[1] = [secret characterAtIndex:i*2+1];
whole_byte = strtol(byte_chars, NULL, 16);
[secretData appendBytes:&whole_byte length:1];
}
CCHmac(kCCHmacAlgSHA256, secretData.bytes, secretData.length, dataIn.bytes, dataIn.length, macOut.mutableBytes);
NSMutableString *stringOut = [NSMutableString stringWithCapacity:macOut.length];
const unsigned char *macOutBytes = macOut.bytes;
for (NSInteger i=0; i<macOut.length; ++i) {
[stringOut appendFormat:@"%02x", macOutBytes[i]];
}
NSLog(@"dataIn: %@", dataIn);
NSLog(@"macOut: %@", macOut);
NSLog(@"stringOut: %@", stringOut);
输出:
2016-09-27 20:18:54.181JKS[27562:5321334]dataIn:
2016-09-27 20:18:54.181JKS[27562:5321334]macOut:
2016-09-27 20:18:54.181JKS[27562:5321334]stringOut: 94a20ca39c8487c7763823ec9c918d9e38ae83cb741439f6d129bcdef9edba73
用Swift更新(代码应该清理)
// http://stackoverflow.com/questions/29799361/generate-a-hmac-swift-sdk8-3-using-cchmac
func generateHMAC(key: String, data: String) -> String {
let keyData = key.dataFromHexadecimalString()! as NSData
let dataIn = data.data(using: .utf8)! as NSData
var result: [CUnsignedChar]
result = Array(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), keyData.bytes, keyData.length, dataIn.bytes, dataIn.length, &result)
let hash = NSMutableString()
for val in result {
hash.appendFormat("%02hhx", val)
}
return hash as String
}
您可以使用此扩展名将十六进制字符串转换为数据
// Modified slightly http://stackoverflow.com/questions/26501276/converting-hex-string-to-nsdata-in-swift
extension String {
func dataFromHexadecimalString() -> Data? {
var data = Data(capacity: characters.count / 2)
let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive)
regex.enumerateMatches(in: self, options: [], range: NSMakeRange(0, characters.count)) { match, flags, stop in
let byteString = (self as NSString).substring(with: match!.range)
var num = UInt8(byteString, radix: 16)
data.append(&num!, count: 1)
}
return data
}
}
并使用do某事,如:
let secret = "71DD0F73AFFBB47825FF9864DDE95F3B"
let value = "Amount=50&BillerID=59&ChannelID=2&Context=34|check|test&ReturnURL=https://uat.myfatoora.com/ReceiptPOC.aspx&TxnRefNum=000000000020003&UserName=DCS"
print("\(generateHMAC(key: secret, data: value))")
你的输出应该是94a20ca39c8487c7763823ec9c918d9e38ae83cb741439f6d129bcdef9edba73
您将需要#导入
问题内容: 在我的iOS Swift应用程序中,我想生成随机UUID( GUID )字符串用作表键,此代码段 似乎 可以正常工作: 这样安全吗? 还是有更好的(推荐)方法? 问题答案: 试试这个: 迅捷3/4/5
问题内容: 我有我需要生成使用。可以转换吗?你们可以帮忙吗? 问题答案: 这是NSArray和NSDictionary的类别,它使此操作变得非常容易。我为漂亮打印添加了一个选项(换行和标签使阅读更容易)。 。 。 。
所以我用https://github.com/franzsilva/flutter_launcher_icons为我的颤动项目生成图标——这很甜蜜,非常感谢。 尝试创建IOS应用程序时,出现以下错误: Project/ios/Runner/Assets.xcassets:错误:没有一个输入目录包含匹配的贴纸图标集或名为"Icon-App"的应用程序图标集。 我对iOS发展知之甚少,所以我不知道发生
我正在尝试构建nativescript-algolia,但它在iOS上失败了。这是我得到的错误: 我已经尝试了从谷歌搜索这个问题中看到的一切。我似乎无法正确设置Swift版本。
Strip build/build/intermediates/archiveintermediates/main/installationbuildproductslocation/applications/main.app/main cd/var/folders/zh/kb_4hqhn4kg1h0r5dp_6htcm0000gn/t/build9030811877552061486xxx/di
一 安装nei-toolkit的新版本 环境配置 构建工具基于 Node.js 平台,因此需要先安装 Node.js 环境,Node.js 在各平台上的安装配置请参阅官方说明。 安装的 Node.js 版本须为 v4.2 及以上 安装 $npm install nei –g 提示1: 如果安装不成功, 可以尝试命令 npm install -g nei 提示2: 如果已经安装过 nei, 请使用
本文向大家介绍iOS使用CIFilter生成二维码,包括了iOS使用CIFilter生成二维码的使用技巧和注意事项,需要的朋友参考一下 二维码(Quick Response Code,简称QR Code)是由水平和垂直两个方向上的线条设计而成的一种二维条形码(barcode)。可以编码网址、电话号码、文本等内容,能够存储大量的数据信息。自iOS 7以来,二维码的生成和读取只需要使用Core Ima
本文向大家介绍iOS二维码的生成代码,包括了iOS二维码的生成代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了iOS二维码的生成代码,供大家参考,具体内容如下 一、工程图。 二、代码。 ViewController.m 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。