iOS の 3-legged OAuth 実装で使用する RSA-SHA1 署名の作成についてサポートが必要です。
CommonCrypto.h を使用して HMAC-SHA1 を使用してこれを行うことができましたが、このライブラリは RSA-SHA1 をサポートしていないようです。
RSA で OAuth 署名を実装した人はいますか? 詳細を確認できるリソースをいくつか教えていただけますか?
ありがとう。
iOS の 3-legged OAuth 実装で使用する RSA-SHA1 署名の作成についてサポートが必要です。
CommonCrypto.h を使用して HMAC-SHA1 を使用してこれを行うことができましたが、このライブラリは RSA-SHA1 をサポートしていないようです。
RSA で OAuth 署名を実装した人はいますか? 詳細を確認できるリソースをいくつか教えていただけますか?
ありがとう。
Erik Villegas の回答も私にとっての解決策でした。しかし、このソリューションを使用するときに遭遇した投稿されたコードにはバグがあります:secretFile
で開かれfopen()
たため、で閉じる必要がありますfclose()
- (NSString *)RSASHA1HashForString:(NSString *)source {
NSLog(@"encrypting %@", source);
if (source == nil) return nil;
OpenSSL_add_all_algorithms();
NSString *signature = nil;
// make a SHA-1 digest of the source string
const char* sourceChars = [source UTF8String];
unsigned char digest[SHA_DIGEST_LENGTH];
SHA1((const unsigned char *)sourceChars, strlen(sourceChars), digest);
NSString *path = [[NSBundle mainBundle] pathForResource:@"privatekey" ofType:@"pem"];
const char *pathCString = [path cStringUsingEncoding:NSUTF8StringEncoding];
FILE *secretFile = fopen(pathCString, "r");
RSA *rsa = NULL;
PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);
if (rsa != NULL) {
unsigned int sigLen = 0;
unsigned char *sigBuff = malloc(RSA_size(rsa));
int result = RSA_sign(NID_sha1, digest, (unsigned int) sizeof(digest),
sigBuff, &sigLen, rsa);
if (result != 0) {
NSData *sigData = [NSData dataWithBytes:sigBuff length:sigLen];
signature = [self base64forData:sigData];
}
free(sigBuff);
RSA_free(rsa);
}
fclose(secretFile);
NSLog(@"generated signature: %@", signature);
return signature;
}
私は最終的に解決策を見つけました。バンドル内の privatekey.pem ファイルを検索し、渡された文字列を使用して RSA-SHA1 署名を作成するメソッドを次に示します。openssl ライブラリを追加する必要があります。このプロジェクトを参照として使用できます: https://github.com/x2on/OpenSSL-for-iPhone
- (NSString *)RSASHA1HashForString:(NSString *)source {
NSLog(@"encrypting %@", source);
if (source == nil) return nil;
OpenSSL_add_all_algorithms();
NSString *signature = nil;
// make a SHA-1 digest of the source string
const char* sourceChars = [source UTF8String];
unsigned char digest[SHA_DIGEST_LENGTH];
SHA1((const unsigned char *)sourceChars, strlen(sourceChars), digest);
NSString *path = [[NSBundle mainBundle] pathForResource:@"privatekey" ofType:@"pem"];
const char *pathCString = [path cStringUsingEncoding:NSUTF8StringEncoding];
FILE *secretFile = fopen(pathCString, "r");
RSA *rsa = NULL;
PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL);
if (rsa != NULL) {
unsigned int sigLen = 0;
unsigned char *sigBuff = malloc(RSA_size(rsa));
int result = RSA_sign(NID_sha1, digest, (unsigned int) sizeof(digest),
sigBuff, &sigLen, rsa);
if (result != 0) {
NSData *sigData = [NSData dataWithBytes:sigBuff length:sigLen];
signature = [self base64forData:sigData];
}
free(sigBuff);
RSA_free(rsa);
}
NSLog(@"generated signature: %@", signature);
return signature;
}
OAuth を実装している場合は、署名ベースをこのメソッドに渡す必要があります。詳細はこちら: http://oauth.net/core/1.0a/#anchor13