当前位置: 首页 > 知识库问答 >
问题:

在iOS中生成SHA256

林威
2023-03-14

我试图生成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)

共有3个答案

王楚青
2023-03-14
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;
    
}
郁景龙
2023-03-14

Windows代码接受字符串,将其解释为十六进制数,并将每次两个字符转换为一个字节。

你的Mac代码最喜欢的是字符串。由于密钥以“71”开头,windows代码将其作为一个单字节,值为0x71=129,Mac代码将其作为两个字节,值为“7”=55,“1”=49。

你所需要做的就是在Mac上转换字节,就像在Windows上一样。你可能不得不做一些不可思议的事情,看看Mac库的源代码,看看它是如何进行实际的哈希计算的。

咸臻
2023-03-14

这里的关键是您需要将您的秘密(十六进制字符串)转换为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 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。