APPセキュリティ関連

キー文字列とクラス名の難読化

1) XOR

#define XOR_KEY 0xFA
#define xorString(str, key) \
{\
    unsigned char *p = str;\
    while( ((*p) ^=  key) != '\0')  p++;\
}

/* 本地数据加密串 */
#define kXorLocalKey ({ \
    unsigned char local_key[] = {(XOR_KEY ^ 'L'), (XOR_KEY ^ 'e'), (XOR_KEY ^ 'a'), \
        (XOR_KEY ^ 'b'), (XOR_KEY ^ 'c'), (XOR_KEY ^ 'd'), (XOR_KEY ^ 'e'), (XOR_KEY ^ '\0')}; \
    xorString(local_key, XOR_KEY);\
    unsigned char result[8]; \
    memcpy(result, local_key, 8); \
    [NSString stringWithFormat:@"%s", result]; \
})

2) 対称暗号化

#define kColorkey ({ \
   uint8_t bytpes[] = {0x6a, 0x39, 0x55, 0x41, 0x31, 0x6a, 0x69, 0x53, 0x38, 0x41, 0x71, 0x64, 0x70, 0x55, 0x73, 0x2f, 0x32, 0x44, 0x4f, 0x4f, 0x78, 0x77, 0x3d, 0x3d}; \
   NSString* keyStr = [[NSString alloc] initWithData:[NSData dataWithBytes:bytpes length:24] encoding:NSASCIIStringEncoding]; \
   AESContent(keyStr); \
}) \

3) クラス名とメソッドの混同

/* 类名重定义(静态类名:LCDataCrypt),降低反编译代码的可读性 */
#ifndef MKCryptRSA
#define MKCryptRSA MKDataCrypt
#endif

/* 方法名混淆 */
#define rsaEncode keyValueEncode

- (void)test {
  [MKCryptRSA decode];
  // 静态分析:[MKDataCrypt decode]
}

// 静态分析:keyValueEncode:
- (NSString *)rsaEncode:(NSString *)content {
  return @"";
}

 ログインクッキーの検証

  • sessionId の有効期間を設定します (バックエンドによって自動的に延長可能)
  • バックエンドによって生成された tokenId を追加します (sessionId と uid が一致します)。
  • ハッシュによる署名署名の生成 (署名ルール + ソルト文字列) (難読化のためのローカル ソルト文字列)
  • HTTPS 一方向認証を使用してリクエストのセキュリティを強化する

JWT認証メカニズム

JWT (JSON Web Token): ログイン後、acces_token とfresh_token が返され、ID 検証のために access_token が要求されます。毎回、access_token は期限切れかどうかを判断するために使用されます。期限切れの場合は、refresh_token リクエスト インターフェイスを使用して、 access_token を更新します。

対称/非対称暗号化キーの長さ

  • 3DES: 16 バイト、24 バイト
  • DES: 8 バイト (長さ 56 ビット + 8 チェック ディジット)
  • AES:16バイト、24バイト、32バイト
  • RSA: 128バイト、256バイト

ハッシュアルゴリズム

  • MD5: セキュリティが低い
  • SHA2: 高いセキュリティ
  • SM3: 高セキュリティ

公開鍵、秘密鍵、証明書の関係

デジタル証明書は、有効期間、認証局、その他の情報を含む CA によって認証された公開キーです。公開キーと秘密キーは相対的なもので、一方が暗号化され、もう一方が復号化され、一方が署名され、もう一方が検証されます。

cer ファイルにはデジタル署名情報と公開鍵が含まれるバイナリ ファイル、pem ファイルは Base64 ファイル、P12 ファイルには cer ファイル (デジタル証明書) と秘密鍵が含まれる Base64 ファイルです。

Charles はブラウザの HTTPS パケット キャプチャを実装します

  • Web プロキシをローカル IP アドレスに設定します。デフォルトのポートは 8888 です。
  • ブラウザに chls.pro/ss と入力して、pem 証明書をダウンロードしてインストールします。
  • 「キーチェーン アクセス」で Charles 証明書をダブルクリックし、「常に信頼」に設定します。
  • charles-SSL プロキシ設定 - 「ドメイン名:ポート」を追加します。
  • charles-Proxy-macOS プロキシ有効 HTTPS パケット キャプチャ。

注: ドメイン名: ポート - (*.tencent.com、*:443、*.tencent.com:443) など

HTTPS 中間者攻撃 (チャールズ、フィドラー パケット キャプチャ)

AFNetworking を例として、bundle-cer デジタル証明書検証を実装します。

- (AFSecurityPolicy *)configSecurityPolicy:(NSString *)url {
    BOOL cerVerify = [url containsString:@"根域名"];
    if (cerVerify) {
        if (self.certifiPolicy.pinnedCertificates.count == 0) {
            return self.defaultPolicy;
        }
        return self.certifiPolicy;
    } else {
        return self.defaultPolicy;
    }
}

- (AFSecurityPolicy *)certifiPolicy {
    if (_certifiPolicy == nil) {
        _certifiPolicy =  [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
        [_certifiPolicy setAllowInvalidCertificates:NO];
        [_certifiPolicy setValidatesDomainName:YES];
        [_certifiPolicy setPinnedCertificates:[self configcertificates]];
    }
    return _defaultPolicy;
}

- (AFSecurityPolicy *)defaultPolicy {
    if (_defaultPolicy == nil) {
        _defaultPolicy = [AFSecurityPolicy defaultPolicy];
        [_defaultPolicy setAllowInvalidCertificates:YES];
        [_defaultPolicy setValidatesDomainName:NO];
    }
    return _defaultPolicy;
}

- (NSSet *)configcertificates {
    NSArray *paths = [[NSBundle mainBundle] pathsForResourcesOfType:@"cer" inDirectory:@"."];
    
    NSMutableSet *certificates = [NSMutableSet setWithCapacity:[paths count]];
    for (NSString *path in paths) {
        NSData *certificateData = [NSData dataWithContentsOfFile:path];
        [certificates addObject:certificateData];
    }
    
    return certificates;
}

 

おすすめ

転載: blog.csdn.net/z119901214/article/details/80583640