PHP获取安卓apk包里的apk签名

项目中需要通过后台上传APK判断合法性,因此用到用PHP获取安卓apk签名来验证,网上搜到的方法一般是通过java的keytool工具来获取。但是对于有些生产环境没有JAVA环境又不能装JAVA环境来说需要另外的方式。方法二将会给出笔者总结的方式。

方法一

所需工具:aapt,Android SDK中的工具,只有一个exe,可以直接运行。
keytool,JDK中的工具,需要安装JDK环境。

需要提供目标应用的apk

1、获取包名

  1. window运行命令行
  2. 切换到aapt所在目录
  3. aapt.ext dump badging 【apk路径】 > 【内容输出到本地文档】
  4. 打开输出的文档,package: name='com.pakgname.swbg'中的''中间的就是包名。

例如:aapt.exe dump badging C:\Users\Administrator\Desktop\demo-apk-1.0.1.8791.apk > C:\Users\Administrator\Desktop\1.txt
获取到的包名是com.pakgname.swbg

2、获取签名

  1. 将原有的应用扩展名(后缀)改为.rar
  2. 修改后解压缩
  3. 打开解压后的目录,进入到META-INF文件夹下,找到一个CERT.RSA的文件
  4. window运行命令行
  5. 切换到keytool所在目录
  6. keytool -printcert -file 【.RSA文件的路径】 > 【内容输出到本地文档】
  7. SHA1:后面的就是签名(哈希)值
    例如
    keytool -printcert -file C:\Users\Administrator\Desktop\demo-apk-1.0.1.8791\META-INF\CERT.RSA > C:\Users\Administrator\Desktop\2.txt

SHA1: 56:BD:02:6B:9D:53:D7:F5:32:B2:BC:BD:BB:34:5B:F1:CD:EF:7F:C0

服务器端,可将命令目录换成对应即可,下面给出PHP中自己封装的方法

获取apk包的签名

    /**
     * 获取安卓APK包的签名
     *
     * @param string $filename apk包路径+名称
     *
     * @return string  检测到签名返回签名   没有检测到 返回空
     */
    function getHash($filename)
    {
        $java = getenv('JAVA_HOME');
        if ($java) {
            $keytoolpath = $java . '/bin/keytool';
            $cmd         = "unzip -p {$filename} META-INF/CERT.RSA | {$keytoolpath} -printcert | grep SHA1: | /usr/bin/awk  '{ print $2 }'";
            $res = trim(shell_exec($cmd));
            shell_exec("rm -rf {$filename}");
            return $res;
        } else {
            shell_exec("rm -rf {$filename}");
            return '';
        }

    }

获取apk包的包名

这里借助github开源的类apkparser
在项目composer.json中执行下面命令或修改composer.json引入即可

composer  require tufanbarisyildirim/php-apk-parser 
    /**
     * 获取安卓APK 包名  PackAgeName
     *
     * @param string $filename apk包路径+名称
     *
     * @return string  包名
     */
    function getPkgName($filename)
    {
        $apk         = new \ApkParser\Parser($filename);
        $manifest    = $apk->getManifest();
        $permissions = $manifest->getPermissions();
        return $manifest->getPackageName();
    }

方法二

方法二适用于没有JAVA环境的情况下,一般linux都会有openssl环境。
原理:通过分析方法一中,发现apk包解压之后,里面会有.rsa签名证书,此证书是一个符合pki体系的x509证书,通过openssl命令即可查看信息。

//不依赖JAVA环境,借助openssl获取APK签名
    function getHash($filename)
    {
        $awk         = '/usr/bin/awk';
        $grep        = '/usr/bin/grep';
        $unzip       = '/usr/bin/unzip';
        $openssl     = '/usr/bin/openssl';
        $greprsa_cmd = "{$unzip} -l {$filename} |  {$grep} META-INF/ |  {$grep} SF | {$awk} -F '/' '{print $2}'";
        $res         = shell_exec($greprsa_cmd);
        $result      = explode('.', $res);
        $rsaname     = $result['0'];

        $cmd = "{$unzip} -p {$filename} META-INF/" . $rsaname . ".RSA | {$openssl} pkcs7 -inform DER   -print_certs | {$openssl} x509 -noout -fingerprint -sha1 -inform pem | {$awk} -F '=' '{print $2}'";
        $res = trim(shell_exec($cmd));
        shell_exec("rm -rf {$filename}");
        return $res;
    }
```php
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容