HMAC-SHA1에 대한 목표-C 샘플 코드
목표 C에서 HMAC-SHA1을 생성해야 한다.하지만 나는 효과가 있는 것을 찾지 못했다.나는 CCHMAC를 사용하는 CommonCrypto와 함께 시도했지만 효과가 없었다.HMAC를 생성하고 HOTP 번호를 생성한 후
누군가 목표 C나 C에 예시 코드가 있나?
SHA-256을 사용하여 HMAC를 생성하는 방법은 다음과 같다.
NSString *key;
NSString *data;
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
length:sizeof(cHMAC)];
NSString *hash = [HMAC base64Encoding];
HOTP 라이브러리는 잘 모르지만 알고리즘은 꽤 간단했다. 내가 정확히 기억한다면.
외부 파일 없이 16진수 문자열을 반환하는 방법은 다음과 같다.
-(NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
for (int i = 0; i < HMACData.length; ++i){
[HMAC appendFormat:@"%02x", buffer[i]];
}
return HMAC;
}
그것은 iOS 7과 함께 xCode 5에서 테스트되었고 잘 작동한다!
이것은 사용자 지정 프로토콜을 사용하지 않고도 작동하며, http://cocoawithlove.com/2009/07/hashvalue-object-for-holding-md5-and.html의 일부 코드를 사용한다.
HashSHA256.h
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
@interface HashSHA256 : NSObject {
}
- (NSString *) hashedValue :(NSString *) key andData: (NSString *) data ;
@end
HashSHA256.m
#import "HashSHA256.h"
#import <CommonCrypto/CommonHMAC.h>
@implementation HashSHA256
- (NSString *) hashedValue :(NSString *) key andData: (NSString *) data {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSString *hash;
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", cHMAC[i]];
hash = output;
return hash;
}
@end
사용량:
- (NSString *) encodePassword: (NSString *) myPassword {
HashSHA256 * hashSHA256 = [[HashSHA256 alloc] init];
NSString * result = [hashSHA256 hashedValue:mySecretSalt andData:myPassword];
return result;
}
HMAC-SHA1 base64를 생성하는 방법은 다음과 같다.
프로젝트에 Base64.h와 Base64.m을 추가해야 한다.여기서부터 얻을 수 있다.
ARC를 사용하면 Base64.m에 오류가 표시된다.이와 비슷한 선 찾기
return [[[self alloc] initWithBase64String:base64String] autorelease];
자동 임대 섹션을 삭제하십시오.최종 결과는 다음과 같아야 한다.
return [[self alloc] initWithBase64String:base64String];
이제 일반 프로젝트에서 "Base64"를 가져오십시오.h" 및 다음 코드
#import "Base64.h"
#include <CommonCrypto/CommonDigest.h>
#include <CommonCrypto/CommonHMAC.h>
- (NSString *)hmacsha1:(NSString *)data secret:(NSString *)key {
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString *hash = [HMAC base64String];
return hash;
}
와 함께
NSLog(@"Hash: %@", hash);
이와 비슷한 것을 얻게 될 것이다.
ghVEjPvxwLN1lBi0Jh46VpIchOc=
관심에서 벗어나 왜 (서명이 없는 char cHMAC)를 만든 다음 (NSData)로 변환한 다음 (NSMutableString)로 변환한 다음 (HexString)으로 변환하는가?
중개인(즉, NSData와 NSMutableString을 완전히 사용하지 않고, 더 빠르고 더 나은 성능), 또한 (부호화되지 않은 문자)을 (uint8_t [])로 변경하면 더 빠른 방법으로 이 작업을 수행할 수 있다. 어쨌든 모두 16진법이다! 아래!
-(NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
uint8_t cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSString *Hash1 = @"";
for (int i=0; i< CC_SHA1_DIGEST_LENGTH; i++)
{
Hash1 = [Hash1 stringByAppendingString:[NSString stringWithFormat:@"%02X", cHMAC[i]]];
}
return Hash1;
}
이게 도움이 됐으면 좋겠는데
안부 전해요
하이더 사티
별도의 라이브러리 또는 해킹 없이 작동하는 완벽한 솔루션:
+(NSString *)hmac:(NSString *)plainText withKey:(NSString *)key
{
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [plainText cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMACData = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
NSString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
for (int i = 0; i < HMACData.length; ++i)
HMAC = [HMAC stringByAppendingFormat:@"%02lx", (unsigned long)buffer[i]];
return HMAC;
}
이미 인코딩된 타사 base64 라이브러리는 포함하지 마십시오.
생성된 해시(바이트)를 판독 가능한 데이터로 변환하기 위해 하루를 꼬박 보낸다.위의 답변에서 base64로 인코딩된 용액을 사용했는데 전혀 효과가 없었다(b.t.w.와 내가 가지고 있던 base64 인코딩을 사용할 수 있는 외부 .h.
그래서 내가 한 것은 다음과 같다. (외부 .h 없이 완벽하게 작동한다.)
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
// Now convert to NSData structure to make it usable again
NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];
// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
NSLog(@"%@",hash);
Jens Alfke의 새로운 MyCrypto 수업 봤어?
그는 자신의 블로그에 샘플 코드를 가지고 있다.
참조URL: https://stackoverflow.com/questions/756492/objective-c-sample-code-for-hmac-sha1
'IT이야기' 카테고리의 다른 글
GCC 기본 포함 디렉터리란? (0) | 2022.04.28 |
---|---|
Android에서 지연된 후 메소드를 호출하는 방법 (0) | 2022.04.28 |
Vuejs 2가 어레이에서 이동하는 항목, 어레이 인덱싱 유지 안 함 (0) | 2022.04.28 |
fflush(stdin) 사용 (0) | 2022.04.28 |
"구조 해킹"은 기술적으로 정의되지 않은 행동인가? (0) | 2022.04.28 |