【问题标题】:iphone SDK : How Can I Convert a string to SHA-1 And SHA-1 to Base64? (for WSSecurity)iphone SDK:如何将字符串转换为 SHA-1 并将 SHA-1 转换为 Base64? (对于 WSSecurity)
【发布时间】:2011-07-06 19:08:31
【问题描述】:

我的转换代码是我所拥有的,但它将字符串转换为 sha-1 到十六进制格式。如何将 sha-1 转换为 base64?

-(NSString *)digest:(NSString*)input

    int i;

    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA1_DIGEST_LENGTH];

    CC_SHA1(data.bytes, data.length, digest);

    output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
                                                     length:CC_SHA1_DIGEST_LENGTH];

    for(i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    {
        [output appendFormat:@"%02x", digest[i]];
    }
    return output;
}

【问题讨论】:

    标签: iphone string base64 sha1


    【解决方案1】:

    iOS 中没有内置散列或 Base64。你必须自己动手。在 Google 中查找 SHA1 的 C 实现;至于 Base64,我有一个给你:

    NSString *ToBase64(NSData *d)
    {
        static const char ALPHABET[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        static const NSString *PAD1 = @"=", *PAD2 = @"==";  
    
        int l = [d length];
        unsigned char *p = (unsigned char*)[d bytes];
        unichar Chunk[4];
        NSMutableString *s = [NSMutableString stringWithCapacity:(l+3)*4/3];
        int i;
        int mod = l % 3;
        int ll = l - mod;
        unsigned int triad;
        NSString *sChunk;
        for(i=0;i<ll;i+=3)
        {
            triad = (p[i]<<16) | (p[i+1]<<8) | p[i+2];
            Chunk[0] = ALPHABET[(triad >> 18) & 0x3f];
            Chunk[1] = ALPHABET[(triad >> 12) & 0x3f];
            Chunk[2] = ALPHABET[(triad >> 6) & 0x3f];
            Chunk[3] = ALPHABET[triad & 0x3f];
            sChunk = [[NSString alloc] initWithCharacters:Chunk length:4];
            [s appendString:sChunk];
            [sChunk release];
        }
        if(mod == 1)
        {
            Chunk[0] = ALPHABET[(p[i] >> 2) & 0x3f];
            Chunk[1] = ALPHABET[(p[i] << 4) & 0x3f];
            sChunk = [[NSString alloc] initWithCharacters:Chunk length:2];
            [s appendString:sChunk];
            [sChunk release];
            [s appendString: PAD2];
        }
        if(mod == 2)
        {
            triad = (p[i]<<8) | p[i+1];
            Chunk[0] = ALPHABET[(triad >> 10) & 0x3f];
            Chunk[1] = ALPHABET[(triad >> 4) & 0x3f];
            Chunk[2] = ALPHABET[(triad << 2) & 0x3f];
            sChunk = [[NSString alloc] initWithCharacters:Chunk length:3];
            [s appendString:sChunk];
            [sChunk release];
            [s appendString: PAD1];     
        }
        return s;
    }
    

    【讨论】:

    • 是的,你是对的。 C 实现可能对我有帮助.. 感谢您的回答
    • commonCrypto 库现在可供 iOS 用户使用。它提供了多种散列方法和编码,包括 MD5 和 SHA1 标准。
    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 2015-08-21
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2014-06-17
    相关资源
    最近更新 更多