[Android セキュリティ] Android アプリ開発者の証明書とコード署名メカニズム

参考リンク:

Android 証明書関連の検証メカニズム:
https://duanqz.github.io/2017-09-01-Android-Digital-Signature
(一部の内容は不正確です)

META-INF ファイルの意味について:
https://blog.csdn.net/diaoxuesong/article/details/78668659

V1 V2 V3 署名メカニズムについて:
https://zhuanlan.zhihu.com/p/108034286

デジタル証明書の原則:
https://network.51cto.com/article/628890.html

デジタル証明書の構造: https://www.cnblogs.com/hyddd/archive/2009/01/07/1371292.html

CERT.RSA の完全なコンテンツ分析について:
https://blog.csdn.net/diaoxuesong/article/details/78668659

Android APK 証明書の原則と実験的検証

1.デジタル署名

  • 通常、MD5 または SHA アルゴリズムを使用して、送信するデータのプレーン テキストをハッシュし、秘密キーを使用してハッシュ値を暗号化し、署名を取得します。データの平文と署名を一緒に送信します。
    (最初に元のデータをハッシュしてから秘密鍵で暗号化する必要があるのはなぜですか? 元のデータは比較的大きい可能性があるため、秘密鍵を直接使用して暗号化すると非常に時間がかかります-消費します。)

  • データを受信した後、署名検証が行われます。実際には、同じハッシュ アルゴリズムを使用して 2 つのハッシュ値を比較します。 /span>< a i=3>データの平文をハッシュし、ハッシュ値を取得します。公開キーを使用して署名を復号します その後、別のハッシュ値が取得されます。 2 つのハッシュ値が同じであれば、 データが改ざんされておらず、 ソースが信頼できることを意味します。

2.キーツール

keytool は、キーと証明書の管理に使用される JDK のツールです。
keytool の主な操作オブジェクトはキーストア ファイルです。通常、このファイルには .keystore または .jks (Java KeyStore) というサフィックスが付いています。
キーストアは複数のキー ペア (キー ペア) を保存でき、各キー ペアには秘密キー (秘密キー) と複数の証明書 (証明書) が含まれます。
ここに画像の説明を挿入します

3. 証明書

証明書は、公開キーに署名し、次に秘密キーに署名した結果です。証明書には署名付き公開キー署名が保存されます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

3.1 認証局CA(Certificate Authority)と証明書チェーン(Certificate Chain)

上記の証明書生成プロセスは無限連鎖につながります。証明書を取得するには、公開鍵 A に秘密鍵 B で署名し、公開鍵 B を公開する必要があります。このように、証明書自体の公開鍵 (つまり、公開鍵 A で表される証明書内の公開鍵) と、秘密鍵 B に対応する公開鍵 (公開鍵 B で表されます) の 2 つの公開鍵が存在します。 。

公開鍵 B の正当性を保証するには、公開鍵 B に秘密鍵 C を使用して署名します。これには、新しい公開鍵 C のリリースが必要です。公開鍵の正当性の保証はチェーンのようなものです。この無限の連鎖を断ち切るためには、証明書を統一的に発行する権威ある組織が必要であり、その組織がCA(Certificate Authority)です。

CA の公開キーは OS に保存され、信頼できるものとみなされます。

CA だけでは多忙すぎます。CA はいくつかのエージェントを承認する必要があり、これらのエージェントは証明書を発行することもできます。エージェントによって発行された証明書も合法で信頼できるとみなされ、証明書チェーンを形成します。

キーストア ファイルの構造: 秘密キー (プライベート キー) と複数の証明書 (証明書) がキー ペア (キー ペア) を形成します。実際には、複数のキー ペアの構造証明書は証明書チェーンです。

4.キーストア

キーストアがキーと証明書を管理するデータベースとみなされる場合、keytool はデータベースを追加、削除、変更、クエリするためのインターフェイスになります。

5. Android V1 署名スキーム

  • アプリケーション レベル: APK に対する Android の署名要件

    Android は未署名の APK のインストールを拒否します
    Android は証明書の正当性を検証しません (これは、発行者の正当性を検証する必要がある https ウェブサイトの証明書とは異なります) 性的)
    署名が一致しない場合、APK のアップグレードは失敗します。

  • システム レベル: デジタル署名に基づく Android の一部のメカニズム
    Android システムをコンパイルするとき、署名はさまざまなアプリケーション タイプに従って実行されます
    Androidデジタル署名に基づいています アプリケーションを承認するかどうかを決定する
    Android は、デジタル署名に基づいて APK の SELinux ラベルをマークします

6. META-INF ディレクトリ

Apk ファイルを解凍すると、META-INF フォルダーが表示され、その下に MANIFEST.MF、CERT.SF、CERT.RSA の 3 つのファイルが含まれています。

MANIFEST.MF の名前は基本的に固定されており、CERT.SF と CERT.RSA は別の名前に変更される可能性があります (たとえば、WeChat アプリでは COM_TENC.SF と COM_TENC.RSA)。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

(実際のテストでは、一部の APK は SHA-1 の代わりに SHA-256 を使用します)

言い換えると、CERT.RSA には証明書と署名が含まれています。CERT.RSA は単純な証明書ではありません。

ここに画像の説明を挿入します

6.1 MANIFEST.MF ファイル

MANIFEST.MF: APK 内の各ファイルの概要を記録します

Manifest-Version: 1.0
Built-By: Generated-by-ADT
Created-By: Android Gradle 3.4.2

Name: AndroidManifest.xml
SHA-256-Digest: 4Gyn/1pQJm4vo9BPrcOhNA9dqX0xN+Ilux6qDn1f24I=

Name: META-INF/androidx.activity_activity.version
SHA-256-Digest: WYVJhIUxBN9cNT4vaBoV/HkkdC+aLkaMKa8kjc5FzgM=

Name: META-INF/androidx.annotation_annotation-experimental.version
SHA-256-Digest: WYVJhIUxBN9cNT4vaBoV/HkkdC+aLkaMKa8kjc5FzgM=

Name: META-INF/androidx.appcompat_appcompat-resources.version
SHA-256-Digest: HltRzeUVOWqfp2KQnPjKZYTMxWSzJdLuvup2F1/pXE0=

Name: META-INF/androidx.appcompat_appcompat.version
SHA-256-Digest: HltRzeUVOWqfp2KQnPjKZYTMxWSzJdLuvup2F1/pXE0=

Name: META-INF/androidx.arch.core_core-runtime.version
SHA-256-Digest: wo/MpTY3vIjhJK8XJd8Ty5jGne3v1i+zzb4c22t2BiQ=

…………

6.2 CERT.SF ファイル

CERT.SF:MANIFEST.MF のダイジェストを計算し、結果は SHA-256-Digest-Manifest に保存されます。同時にMANIFEST.MF の各項目の概要を計算し、結果は CERT.SF の各項目に保存されます。

Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA-256-Digest-Manifest: ifpWUlrHBqAXmGWiygrMlMr4BL+9Z+J1xzN6IAKIi7U=
X-Android-APK-Signed: 2

Name: AndroidManifest.xml
SHA-256-Digest: FM8SO8spjSfyYXZCcMfhl93XRKbKItHolj1eOAaLnx4=

Name: META-INF/androidx.activity_activity.version
SHA-256-Digest: Yu1eiqd7wti3kPabgLC0lsO+1ns/UAhiPGUExHOxH/w=

Name: META-INF/androidx.annotation_annotation-experimental.version
SHA-256-Digest: Lxz3EbTZKQ+6YHD56UXKdC4eR6Vt/RCS/mhbehwNKY0=

Name: META-INF/androidx.appcompat_appcompat-resources.version
SHA-256-Digest: d8qnGN0xpQnZXwhik1KeeAcyufb6b2l+Ods8bsHKkVE=

Name: META-INF/androidx.appcompat_appcompat.version
SHA-256-Digest: YwDR0Rxo15s+KFBZKd2nWg6Xm4mF+YmpBoHOItYOSoU=

Name: META-INF/androidx.arch.core_core-runtime.version
SHA-256-Digest: PjygIQMN5T6nIKT/hi5PFaxVcEB+W20fr4f0g2n7jrg=
…………

もう 1 つ SHA-256-Digest-Manifest があることがわかります (値は ifpWUlrHBqAXmGWiygrMlMr4BL+9Z+J1xzN6IAKIi7U=)。これは、MANIFEST.MF ファイルの SHA256 値を Base64 エンコードすることによって取得されます。

検証プロセスは次のとおりです。

使用オンライン ツール (このツールはオフラインで保存できます) を使用して、MANIFEST.MF ファイルの SHA256 値を計算します。89fa56525ac706a0179865a2ca0acc94caf804bfbd67e275c7337a2002888bb5
ここに画像の説明を挿入します

使用オンライン ツールを使用して、SHA256 値 (16 進数形式) の Base64 エンコード結果を見つけます。ifpWUlrHBqAXmGWiygrMlMr4BL+9Z+J1xzN6IAKIi7U=
ここに画像の説明を挿入します
この値は、CERT.SF の SHA-256-Digest-Manifest と同じです。

6.3 CERT.RSA ファイル

CERT.RSA: メイン コンテンツはCERT.SF の秘密キー A の署名 (ダイジェストの秘密キー A) CERT.SF 暗号化の)と証明書(公開キー A の保存に使用)。 RSA サフィックスは、署名が RSA アルゴリズムに基づいて生成されたことを示します。

証明書の重要な機能は公開キー A を保存することです。同時に、証明書は検証可能です (追加情報が取得された場合、ユーザーは証明書が正当であるかどうかを判断できます)。

3 つの中で秘密キーを使用するのは CERT.RSA だけであることに注意してください。


6.3.1 証明書部分の分析

証明書は保存されます:{公開鍵 A+関連情報},{公開鍵 A +関連情報 } の秘密鍵 B の署名結果 (および署名アルゴリズム)。公開鍵 A と秘密鍵 A はペアであり、公開鍵 B と秘密鍵 B はペアです。証明書の有効性を検証する必要がある場合、ユーザーは公開鍵 B を何らかの手段 (通常は上位証明書を介して) で取得し、検証 { 秘密鍵の署名結果を復号化します。公開鍵Aの鍵B+関連情報}を計算してダイジェスト1を取得; {公開鍵A+関連情報}のダイジェストを計算して要約2を取得; ダイジェスト1とダイジェスト2を比較して同じかどうかを確認します。それらが同じであれば、証明書は信頼されます。

Openssl を使用して証明書の一部を抽出します。

openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text > CERT.RSA-cert.txt

内容は以下の通りです。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 33548542 (0x1ffe8fe)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN
        Validity
            Not Before: Dec 20 04:41:56 2018 GMT
            Not After : Dec 14 04:41:56 2043 GMT
        Subject: C=CN
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:dd:3f:31:51:7f:b3:2f:dd:07:9c:6f:66:3d:eb:
                    17:84:6d:7a:19:1f:bd:63:07:e3:be:30:41:09:a3:
                    84:e7:ab:7f:4b:88:0c:b6:27:3d:38:e6:28:3b:60:
                    ac:19:a9:98:cd:0f:3c:24:67:47:5f:f8:11:b1:e6:
                    00:eb:b0:a4:97:ff:db:db:1f:f8:e8:f7:74:66:51:
                    e2:46:7a:8b:ea:99:28:72:6e:83:f2:d3:50:0c:7e:
                    aa:e5:8a:58:03:98:e9:04:cd:1f:55:39:64:88:b8:
                    92:99:7c:ec:3f:a3:b8:68:44:df:f0:70:b1:2c:50:
                    d6:e8:be:82:3b:20:b6:04:cd:37:e1:1a:43:9b:7e:
                    b5:64:86:8e:ab:8f:8a:c1:86:7d:d8:cb:c7:a3:0c:
                    38:75:01:f4:ec:ad:ec:f5:5c:22:33:80:d6:d9:40:
                    69:dc:f2:d0:7d:19:69:8b:69:f8:48:b3:6f:b0:3c:
                    83:95:17:6d:5b:21:34:64:61:4a:f8:f3:80:fe:e7:
                    f3:2e:7b:86:4a:c8:f7:e2:e0:cd:ff:4f:e3:ad:d9:
                    18:58:fb:cc:7e:29:ff:a1:b8:20:37:25:31:cb:c1:
                    08:84:a2:07:08:35:4f:c9:52:28:c4:56:6a:59:92:
                    bd:ea:3d:47:41:80:1b:a5:0d:f1:f9:52:27:54:63:
                    d4:2f
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                07:8C:E8:A0:26:83:A6:E8:5D:C1:84:E7:C2:D4:45:8E:A4:D8:62:5A
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        3c:0c:03:7f:5c:20:92:0d:f1:a7:9a:35:77:23:b9:f2:d4:bc:
        76:81:f6:2a:4b:6e:ac:7b:e7:e1:b4:c2:5b:e2:56:b5:cb:33:
        c4:d6:5e:12:64:df:5a:a6:0c:3d:e6:74:e8:2b:62:3f:7f:0a:
        16:51:51:ce:9c:f2:c1:88:6c:71:2b:73:53:0a:09:1c:60:86:
        5d:6f:94:9e:60:0d:dd:a8:f6:e6:51:bf:13:d7:d9:38:81:ea:
        4b:88:87:20:b0:bf:23:93:3c:9b:85:43:f8:81:f8:e2:ee:0d:
        24:6b:48:c9:0b:e7:3c:eb:2d:a9:68:04:aa:44:6c:b0:59:80:
        2b:3c:7e:ba:70:35:b5:22:32:d7:bf:3f:5b:7b:fb:bb:bf:ae:
        b0:78:8e:4e:5a:87:2c:1a:b9:8f:1b:f9:1b:01:15:b5:fb:9a:
        51:53:f6:a2:8b:93:84:37:f5:93:b9:f3:06:4d:37:10:21:f8:
        e0:c8:83:1e:a4:f1:75:64:41:59:1b:68:c2:26:e3:9b:c0:8c:
        d1:61:6c:62:bb:5b:fc:8f:d4:ee:e5:c2:97:6d:7a:e0:01:b9:
        7c:08:7e:10:59:f6:4b:d7:7a:9f:c1:d6:99:c7:dd:89:ff:a2:
        1c:13:53:b2:5f:09:5a:82:1d:b4:bf:59:63:bb:66:a6:88:0a:
        4b:a2:f4:47

ここに画像の説明を挿入します
ここに画像の説明を挿入します

で:

署名値 ( 3C 0C 03 7F …… 47) は、{公開鍵 A + 関連情報}ここでは関与しません

署名値は、JEB を使用して表示することもできます。
ここに画像の説明を挿入します

モジュラス (係数) と指数 (指数) を合わせて公開キーを構成します。
係数は:

DD3F31517FB32FDD079C6F663DEB17846D7A191FBD6307E3BE304109A384E7AB7F4B880CB6273D38E6283B60AC19A998CD0F3C2467475FF811B1E600EBB0A497FFDBDB1FF8E 8F7746651E2467A8BEA9928726E83F2D3500C7EAAE58A580398E904CD1F55396488B892997CEC3FA3B86844DFF070B12C50D6E8BE823B20B604CD37E11A439B7EB564 868EAB8F8AC1867DD8CBC7A30C387501F4ECADECF55C223380D6D94069DCF2D07D19698B69F848B36FB03C8395176D5B213464614AF8F380FEE7F32E7B864AC8F7E2E0CDFF4 FE 3ADD91858FBCC7E29FFA1B820372531CBC10884A20708354FC95228C4566A5992BDEA3D4741801BA50DF1F952275463D42F

指数は次のとおりです。65537 (0x10001)

オンライン ツールを使用して RSA 公開キーを PEM 形式で生成します。

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3T8xUX+zL90HnG9mPesX
hG16GR+9YwfjvjBBCaOE56t/S4gMtic9OOYoO2CsGamYzQ88JGdHX/gRseYA67Ck
l//b2x/46Pd0ZlHiRnqL6pkocm6D8tNQDH6q5YpYA5jpBM0fVTlkiLiSmXzsP6O4
aETf8HCxLFDW6L6COyC2BM034RpDm361ZIaOq4+KwYZ92MvHoww4dQH07K3s9Vwi
M4DW2UBp3PLQfRlpi2n4SLNvsDyDlRdtWyE0ZGFK+POA/ufzLnuGSsj34uDN/0/j
rdkYWPvMfin/obggNyUxy8EIhKIHCDVPyVIoxFZqWZK96j1HQYAbpQ3x+VInVGPU
LwIDAQAB
-----END PUBLIC KEY-----

6.3.2 CERT.SFの秘密鍵Aの署名部分の解析

Openssl を使用して、CERT.RSA の内容全体を表示します。

openssl asn1parse -inform DER -in CERT.RSA -dump > CERT.RSA.txt
    0:d=0  hl=4 l=1081 cons: SEQUENCE          
    4:d=1  hl=2 l=   9 prim: OBJECT            :pkcs7-signedData
   15:d=1  hl=4 l=1066 cons: cont [ 0 ]        
   19:d=2  hl=4 l=1062 cons: SEQUENCE          
   23:d=3  hl=2 l=   1 prim: INTEGER           :01
   26:d=3  hl=2 l=  15 cons: SET               
   28:d=4  hl=2 l=  13 cons: SEQUENCE          
   30:d=5  hl=2 l=   9 prim: OBJECT            :sha256
   41:d=5  hl=2 l=   0 prim: NULL              
   43:d=3  hl=2 l=  11 cons: SEQUENCE          
   45:d=4  hl=2 l=   9 prim: OBJECT            :pkcs7-data
   56:d=3  hl=4 l= 701 cons: cont [ 0 ]        
   60:d=4  hl=4 l= 697 cons: SEQUENCE          
   64:d=5  hl=4 l= 417 cons: SEQUENCE          
   68:d=6  hl=2 l=   3 cons: cont [ 0 ]        
   70:d=7  hl=2 l=   1 prim: INTEGER           :02
   73:d=6  hl=2 l=   4 prim: INTEGER           :01FFE8FE
   79:d=6  hl=2 l=  13 cons: SEQUENCE          
   81:d=7  hl=2 l=   9 prim: OBJECT            :sha256WithRSAEncryption
   92:d=7  hl=2 l=   0 prim: NULL              
   94:d=6  hl=2 l=  13 cons: SEQUENCE          
   96:d=7  hl=2 l=  11 cons: SET               
   98:d=8  hl=2 l=   9 cons: SEQUENCE          
  100:d=9  hl=2 l=   3 prim: OBJECT            :countryName
  105:d=9  hl=2 l=   2 prim: PRINTABLESTRING   :CN
  109:d=6  hl=2 l=  30 cons: SEQUENCE          
  111:d=7  hl=2 l=  13 prim: UTCTIME           :181220044156Z
  126:d=7  hl=2 l=  13 prim: UTCTIME           :431214044156Z
  141:d=6  hl=2 l=  13 cons: SEQUENCE          
  143:d=7  hl=2 l=  11 cons: SET               
  145:d=8  hl=2 l=   9 cons: SEQUENCE          
  147:d=9  hl=2 l=   3 prim: OBJECT            :countryName
  152:d=9  hl=2 l=   2 prim: PRINTABLESTRING   :CN
  156:d=6  hl=4 l= 290 cons: SEQUENCE          
  160:d=7  hl=2 l=  13 cons: SEQUENCE          
  162:d=8  hl=2 l=   9 prim: OBJECT            :rsaEncryption
  173:d=8  hl=2 l=   0 prim: NULL              
  175:d=7  hl=4 l= 271 prim: BIT STRING        
      0000 - 00 30 82 01 0a 02 82 01-01 00 dd 3f 31 51 7f b3   .0.........?1Q..
      0010 - 2f dd 07 9c 6f 66 3d eb-17 84 6d 7a 19 1f bd 63   /...of=...mz...c
      0020 - 07 e3 be 30 41 09 a3 84-e7 ab 7f 4b 88 0c b6 27   ...0A......K...'
      0030 - 3d 38 e6 28 3b 60 ac 19-a9 98 cd 0f 3c 24 67 47   =8.(;`......<$gG
      0040 - 5f f8 11 b1 e6 00 eb b0-a4 97 ff db db 1f f8 e8   _...............
      0050 - f7 74 66 51 e2 46 7a 8b-ea 99 28 72 6e 83 f2 d3   .tfQ.Fz...(rn...
      0060 - 50 0c 7e aa e5 8a 58 03-98 e9 04 cd 1f 55 39 64   P.~...X......U9d
      0070 - 88 b8 92 99 7c ec 3f a3-b8 68 44 df f0 70 b1 2c   ....|.?..hD..p.,
      0080 - 50 d6 e8 be 82 3b 20 b6-04 cd 37 e1 1a 43 9b 7e   P....; ...7..C.~
      0090 - b5 64 86 8e ab 8f 8a c1-86 7d d8 cb c7 a3 0c 38   .d.......}.....8
      00a0 - 75 01 f4 ec ad ec f5 5c-22 33 80 d6 d9 40 69 dc   u......\"3...@i.
      00b0 - f2 d0 7d 19 69 8b 69 f8-48 b3 6f b0 3c 83 95 17   ..}.i.i.H.o.<...
      00c0 - 6d 5b 21 34 64 61 4a f8-f3 80 fe e7 f3 2e 7b 86   m[!4daJ.......{.
      00d0 - 4a c8 f7 e2 e0 cd ff 4f-e3 ad d9 18 58 fb cc 7e   J......O....X..~
      00e0 - 29 ff a1 b8 20 37 25 31-cb c1 08 84 a2 07 08 35   )... 7%1.......5
      00f0 - 4f c9 52 28 c4 56 6a 59-92 bd ea 3d 47 41 80 1b   O.R(.VjY...=GA..
      0100 - a5 0d f1 f9 52 27 54 63-d4 2f 02 03 01 00 01      ....R'Tc./.....
  450:d=6  hl=2 l=  33 cons: cont [ 3 ]        
  452:d=7  hl=2 l=  31 cons: SEQUENCE          
  454:d=8  hl=2 l=  29 cons: SEQUENCE          
  456:d=9  hl=2 l=   3 prim: OBJECT            :X509v3 Subject Key Identifier
  461:d=9  hl=2 l=  22 prim: OCTET STRING      
      0000 - 04 14 07 8c e8 a0 26 83-a6 e8 5d c1 84 e7 c2 d4   ......&...].....
      0010 - 45 8e a4 d8 62 5a                                 E...bZ
  485:d=5  hl=2 l=  13 cons: SEQUENCE          
  487:d=6  hl=2 l=   9 prim: OBJECT            :sha256WithRSAEncryption
  498:d=6  hl=2 l=   0 prim: NULL              
  500:d=5  hl=4 l= 257 prim: BIT STRING        
      0000 - 00 3c 0c 03 7f 5c 20 92-0d f1 a7 9a 35 77 23 b9   .<...\ .....5w#.
      0010 - f2 d4 bc 76 81 f6 2a 4b-6e ac 7b e7 e1 b4 c2 5b   ...v..*Kn.{....[
      0020 - e2 56 b5 cb 33 c4 d6 5e-12 64 df 5a a6 0c 3d e6   .V..3..^.d.Z..=.
      0030 - 74 e8 2b 62 3f 7f 0a 16-51 51 ce 9c f2 c1 88 6c   t.+b?...QQ.....l
      0040 - 71 2b 73 53 0a 09 1c 60-86 5d 6f 94 9e 60 0d dd   q+sS...`.]o..`..
      0050 - a8 f6 e6 51 bf 13 d7 d9-38 81 ea 4b 88 87 20 b0   ...Q....8..K.. .
      0060 - bf 23 93 3c 9b 85 43 f8-81 f8 e2 ee 0d 24 6b 48   .#.<..C......$kH
      0070 - c9 0b e7 3c eb 2d a9 68-04 aa 44 6c b0 59 80 2b   ...<.-.h..Dl.Y.+
      0080 - 3c 7e ba 70 35 b5 22 32-d7 bf 3f 5b 7b fb bb bf   <~.p5."2..?[{...
      0090 - ae b0 78 8e 4e 5a 87 2c-1a b9 8f 1b f9 1b 01 15   ..x.NZ.,........
      00a0 - b5 fb 9a 51 53 f6 a2 8b-93 84 37 f5 93 b9 f3 06   ...QS.....7.....
      00b0 - 4d 37 10 21 f8 e0 c8 83-1e a4 f1 75 64 41 59 1b   M7.!.......udAY.
      00c0 - 68 c2 26 e3 9b c0 8c d1-61 6c 62 bb 5b fc 8f d4   h.&.....alb.[...
      00d0 - ee e5 c2 97 6d 7a e0 01-b9 7c 08 7e 10 59 f6 4b   ....mz...|.~.Y.K
      00e0 - d7 7a 9f c1 d6 99 c7 dd-89 ff a2 1c 13 53 b2 5f   .z...........S._
      00f0 - 09 5a 82 1d b4 bf 59 63-bb 66 a6 88 0a 4b a2 f4   .Z....Yc.f...K..
      0100 - 47                                                G
  761:d=3  hl=4 l= 320 cons: SET               
  765:d=4  hl=4 l= 316 cons: SEQUENCE          
  769:d=5  hl=2 l=   1 prim: INTEGER           :01
  772:d=5  hl=2 l=  21 cons: SEQUENCE          
  774:d=6  hl=2 l=  13 cons: SEQUENCE          
  776:d=7  hl=2 l=  11 cons: SET               
  778:d=8  hl=2 l=   9 cons: SEQUENCE          
  780:d=9  hl=2 l=   3 prim: OBJECT            :countryName
  785:d=9  hl=2 l=   2 prim: PRINTABLESTRING   :CN
  789:d=6  hl=2 l=   4 prim: INTEGER           :01FFE8FE
  795:d=5  hl=2 l=  13 cons: SEQUENCE          
  797:d=6  hl=2 l=   9 prim: OBJECT            :sha256
  808:d=6  hl=2 l=   0 prim: NULL              
  810:d=5  hl=2 l=  13 cons: SEQUENCE          
  812:d=6  hl=2 l=   9 prim: OBJECT            :rsaEncryption
  823:d=6  hl=2 l=   0 prim: NULL              
  825:d=5  hl=4 l= 256 prim: OCTET STRING      
      0000 - 13 6e 93 d0 23 ce b7 33-d5 ed fa e7 cd 10 cf 56   .n..#..3.......V
      0010 - 77 c5 e5 f6 03 07 49 31-70 d3 ad 1f 01 69 e0 e7   w.....I1p....i..
      0020 - 31 0b 9b 26 57 7a e0 b1-66 79 79 8e af 57 ac 44   1..&Wz..fyy..W.D
      0030 - c5 88 d5 50 cd ba 5e f9-0e e9 77 17 30 50 29 28   ...P..^...w.0P)(
      0040 - 08 aa 98 20 3b 56 2f f6-10 2e e4 d8 2b 29 e4 6e   ... ;V/.....+).n
      0050 - 9d 4e 96 e2 03 0c df af-9a b4 bb fd a8 9c f7 39   .N.............9
      0060 - 29 45 23 3f 01 13 0e 3d-b7 02 a2 d8 53 6a eb aa   )E#?...=....Sj..
      0070 - 21 71 9a af 0f 35 5b ec-26 51 d0 22 96 df 8d 14   !q...5[.&Q."....
      0080 - 88 98 d4 d4 de 29 9d 77-17 96 e2 e3 bd cc b7 f0   .....).w........
      0090 - 61 17 48 a8 33 f5 2e 40-77 b2 42 e1 cf db ef ac   [email protected].....
      00a0 - 65 a2 1e 10 2e a2 47 8f-b6 9b 7b 3b 84 43 bd 92   e.....G...{;.C..
      00b0 - 57 72 ca e5 f8 d9 72 7d-3c 11 d7 4b b9 b0 1f ca   Wr....r}<..K....
      00c0 - 23 e3 07 bb d0 60 4d 4c-0c 28 11 bd 79 8a 2e b8   #....`ML.(..y...
      00d0 - ce 75 6c bb 53 15 36 79-25 39 6c 55 66 97 87 5a   .ul.S.6y%9lUf..Z
      00e0 - be 8e ad 29 cc 99 f9 fa-c0 c7 fe 9d 7b f9 47 22   ...)........{.G"
      00f0 - da ad 6d 90 66 61 52 45-95 cf 15 18 3c f3 51 58   ..m.faRE....<.QX

ここで00 3c 0c ... 47 は証明書の暗号化の結果です。これは証明書の信頼性を検証するために使用され、ここでは関与しません。

13 6e ... 58 の末尾の 16 進数は CERT.SF の秘密鍵 A の署名です。また、

136E93D023CEB733D5EDFAE7CD10CF5677C5E5F60307493170D3AD1F0169E0E7310B9B26577AE0B16679798EAF57AC44C588D550CDBA5EF90EE977173050292808AA9820 3B562FF6102EE4D82B29E46E9D4E96E2030CDFAF9AB4BBFDA89CF7392945233F01130E3DB702A2D8536AEBAA21719AAF0F355BEC2651D02296DF8D148898D4D4DE299D77179 6E2E3BDCCB7F0611748A833F52E4077B242E1CFDBEFAC65A21E102EA2478FB69B7B3B8443BD925772CAE5F8D9727D3C11D74BB9B01FCA23E307BBD0604D4C0C2811BD798A2 E B8CE756CBB5315367925396C556697875ABE8EAD29CC99F9FAC0C7FE9D7BF94722DAAD6D906661524595CF15183CF35158

オンライン ツールを使用して値を復号化します。
このうち、公開鍵は PEM 形式であり、上記の Modulus と Exponent によって次のように生成されます。

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3T8xUX+zL90HnG9mPesX
hG16GR+9YwfjvjBBCaOE56t/S4gMtic9OOYoO2CsGamYzQ88JGdHX/gRseYA67Ck
l//b2x/46Pd0ZlHiRnqL6pkocm6D8tNQDH6q5YpYA5jpBM0fVTlkiLiSmXzsP6O4
aETf8HCxLFDW6L6COyC2BM034RpDm361ZIaOq4+KwYZ92MvHoww4dQH07K3s9Vwi
M4DW2UBp3PLQfRlpi2n4SLNvsDyDlRdtWyE0ZGFK+POA/ufzLnuGSsj34uDN/0/j
rdkYWPvMfin/obggNyUxy8EIhKIHCDVPyVIoxFZqWZK96j1HQYAbpQ3x+VInVGPU
LwIDAQAB
-----END PUBLIC KEY-----

復号化結果:
ここに画像の説明を挿入します
復号化されたデータは次のとおりです:

30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 A2 B4 DB 1A 50 BE BC 75 40 5B AB E5 C1 3B 96 CF DF 92 E6 50 65 4E DB 6F 56 46 E0 2 B41B2C1 E9

その中にはA2 B4 DB 1A 50 BE BC 75 40 5B AB E5 C1 3B 96 CF DF 92 E6 50 65 4E DB 6F 56 46 E0 2B 41 B2 C1 E9 CERT.SF の SHA256 ダイジェストがあります。

次のように確認します。
ここに画像の説明を挿入します


6.3.3 CERT.RSA から証明書フィンガープリント (Fingerprint) を抽出する

証明書のフィンガープリントは証明書のハッシュです。

keytool を使用して、CERT.RSA の証明書のフィンガープリントを表示することもできます。

keytool --printcert -file CERT.RSA
所有者: C=CN
发布者: C=CN
序列号: 1ffe8fe
生效时间: Thu Dec 20 12:41:56 CST 2018, 失效时间: Mon Dec 14 12:41:56 CST 2043
证书指纹:
         SHA1: 8B:4F:1A:B3:95:AB:B7:49:1F:44:49:E5:51:00:06:8A:FA:53:39:8B
         SHA256: 8A:73:D3:A5:73:B4:30:18:81:ED:60:2A:57:6A:2C:BF:50:07:8C:4C:C8:0B:CE:52:FF:F7:19:33:98:6B:7A:66
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 07 8C E8 A0 26 83 A6 E8   5D C1 84 E7 C2 D4 45 8E  ....&...].....E.
0010: A4 D8 62 5A                                        ..bZ
]
]

JEB を使用して関連情報を表示することもできます。
ここに画像の説明を挿入します
このフィンガープリントは、さまざまなサードパーティ SDK プラットフォームのクライアント認証によく使用されます (この値は SDK プラットフォームに報告する必要があります) 、SDK がインターフェイスの取得を調整します)。

6.3.4 APP が証明書のフィンガープリントを取得する方法 (Fingerprint)

通常、アプリは証明書のフィンガープリントを取得して、現在のアプリ クライアントが改ざんされているかどうかを確認する必要があります。

アプリ内の関連する Java コードは次のとおりです。

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) 
    {
    
    
        packageInfo = packageManager.getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNING_CERTIFICATES);
        SigningInfo signingInfo = packageInfo.signingInfo;
        signatures = signingInfo.getApkContentsSigners();
    } else {
    
    
        packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
        signatures = packageInfo.signatures;
    }
    String signBase64 = Base64Util.encodeToString(signatures [0].toByteArray());
    nowSignMD5 = MD5Utils.MD5(signBase64);

7. 関連検証

7.1 アプリレベル

7.1.1 Android は証明書なしで APK のインストールを拒否します

コマンド ライン adb install を使用して未署名の APK をインストールすると、INSTALL_PARSE_FAILED_NO_CERTIFICATESエラーが表示されます。

7.1.2 Android は証明書の正当性を検証しません

証明書内の公開キーを使用して CERT.SF 署名を復号して取得した CERT.SF ダイジェストが、計算された CERT.SF ダイジェストと同じである限り、Android は証明書が正規かどうかに関係なくインストールを許可します。

7.1.3 2 つのバージョンの証明書が一致しない場合、APK のアップグレードは失敗します

APK の 2 つのバージョンの証明書に一貫性がない場合、Android は APK のアップグレードを拒否します。

7.2 オペレーティング システム レベル

7.2.1 Android のシステム署名

Android は、プラットフォーム、共有、メディア、テストキーの 4 つの異なるタイプの署名を設計しました。これらはデフォルトでソース コードの build/target/product/security ディレクトリに配置され、さまざまなタイプのシステム アプリケーションに署名するために使用されます。 Android Lollipop 以降、Android では改ざんを防ぐために boot.img と system.img にも署名するため、元の 4 つの署名セットに Verity が追加されます。

build/target/product/security
├── (media.pk8, media.x509.pem)       #用于给MediaProvider, Gallery等签名
├── (platform.pk8, platform.x509.pem) #用于给Settings, Phone等签名
├── (shared.pk8, shared.x509.pem)     #用于给Launcher, Dailer等签名
├── (testkey.pk8, testkey.x509.pem)   #用于给一般应用签名
└── (verity.pk8, verity.x509.pem)     #用于给boot.img和system.img签名

.pk8 は秘密キー、.509.pem は証明書 (公開キーを含む) です。

7.2.2 署名に基づいて権限を区切る

アプリケーションは独自の権限を定義し、protectionLevel を設定して、Android の権限付与メカニズムによる API の悪用を防ぐことができます。
たとえば、packages/apps/Launcer3/AndroidManifest.xml では、次の権限が定義されています。

<permission
    android:name="com.android.launcher3.permission.WRITE_SETTINGS"
    android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
    android:protectionLevel="signatureOrSystem"
    android:label="@string/permlab_write_settings"
    android:description="@string/permdesc_write_settings"/>

android:protectionLevel="signatureOrSystem"
これは、アプリが com.android.launcher3.permission.WRITE_SETTINGS 権限を取得するには、アプリが同じ署名 (公開鍵と秘密鍵のペア) を持っている必要があることを意味します。 Launcher3 として、またはシステム アプリケーションです。

デジタル署名を使用すると、追加の信頼できるメカニズムと同等になります。同じ署名を持つ 2 つの異なる APK は、それらが同じソースからのものであり、相互に信頼されていることを意味します。

7.2.3 署名に基づいた SELinux タグ APK

詳細については、「Android デジタル署名のメカニズムとアプリケーション シナリオ」 を参照してください。

SELinux 環境では、すべてのファイルとプロセスにラベルが付いています (ファイルは ls -Z コマンドで表示でき、プロセスは ps -Z コマンドで表示できます)このラベルはSELinux コンテキストと呼ばれます。

  • たとえば、system/sepolicy/file_contexts ファイルは、一部のシステム ファイルとディレクトリのラベルを定義します。
  • 一部のラベルはルールに基づいて生成されます。たとえば、子プロセスをフォークする場合、子プロセスは TE (Type Enforcement) ファイルで定義されたルールに従ってラベルが付けられます。
    ここに画像の説明を挿入します
  1. Android は署名に基づいて APK にタグを付けます。 system/sepolicy/mac_permissions.xmlSELinux タグへの署名のマッピングは、 に記録されます。
  2. APK アプリケーション プロセスが開始されると、プロセスの SELinux ラベルが、seap_contexts で定義された seinfo=>SELinux コンテキスト マッピングに従って設定されます。

異なるタグは、異なる操作可能なファイル タイプに対応します (system_app_data_file など)。

おすすめ

転載: blog.csdn.net/qq_39441603/article/details/123767506