2010-12-31 20 views
1

こんにちは私は、ユーザーが別のサウンドを購入できるアプリの購入で設定しています。一度購入すると、彼はその音をAppで再生することができます。サウンドファイルはすべて私のリソースフォルダにあり、購入されたファイルのレコードを(plistで)保持しています。 いいえIAPファイルを右クリックしてそのコンテンツを見ると、リソースが表示されます。したがって、実際にそれらを購入しなくても、それらのサウンドを持つことができます。 保護されたバンドルなどはありますか?アプリ購入リソースセキュリティ

答えて

1

これらのファイルをそれぞれ暗号化し、購入時に暗号化して解読し、使用可能にすることができます。

.H:

#import <Foundation/Foundation.h> 

@interface NSData (DataCategory) 

- (NSData *)AES256EncryptWithKey:(NSString *)key; 
- (NSData *)AES256DecryptWithKey:(NSString *)key; 

@end 

.M

#import "NSDataCategory.h" 
#import <CommonCrypto/CommonCryptor.h> 

@implementation NSData (DataCategory) 

- (NSData *)AES256EncryptWithKey:(NSString *)key { 
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesEncrypted); 
    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

- (NSData *)AES256DecryptWithKey:(NSString *)key { 
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesDecrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesDecrypted); 

    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

@end 

コードhereから使用

以下は、それは簡単なのiOSでデータを暗号化することができますNSDataカテゴリです。

+0

こんにちは、ありがとうございます。私は、ファイルの暗号化と復号化は良いアイデアだと思っていますが、そのためにはすべてのサウンドファイルを暗号化する必要があります。それは長い時間と労力がかかります。しかし、とにかくありがとう。私はあなたのアプローチが好きです。 – jAmi

-2

いつでもサウンドファイルのビットの一部を反転し、アプリから購入した後に戻すことができます。変更の程度に応じて、ファイルヘッダーを壊すか、または修正するまでオーディオを完全にマングルすることができます。