Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图在Android中创建应用程序校验和,但它';这是不变的_Java_Android_Apk_Checksum - Fatal编程技术网

Java 试图在Android中创建应用程序校验和,但它';这是不变的

Java 试图在Android中创建应用程序校验和,但它';这是不变的,java,android,apk,checksum,Java,Android,Apk,Checksum,我正在Android上开发一个应用程序,并且有一项法律要求,即生成一个应用程序校验和,该校验和可以被记录下来以检查以后的篡改。我意识到这不是完全安全的,但我有一个盒子要打勾 我正在尝试这个,公然从以下示例中盗取: 运行良好,输出良好: 09-27 15:17:35.775 17288-17288/com.test.checksum.checksum I/Checksum: getting checksum for /data/app/com.test.checksum.checksum-2/ba

我正在Android上开发一个应用程序,并且有一项法律要求,即生成一个应用程序校验和,该校验和可以被记录下来以检查以后的篡改。我意识到这不是完全安全的,但我有一个盒子要打勾

我正在尝试这个,公然从以下示例中盗取:

运行良好,输出良好:

09-27 15:17:35.775 17288-17288/com.test.checksum.checksum I/Checksum: getting checksum for /data/app/com.test.checksum.checksum-2/base.apk
09-27 15:17:35.775 17288-17288/com.test.checksum.checksum I/Checksum: Size: 3245610
09-27 15:17:35.775 17288-17288/com.test.checksum.checksum I/Checksum: Date: Wed Sep 27 15:17:03 BST 2017
09-27 15:17:37.075 17288-17288/com.test.checksum.checksum I/Checksum: And Checksum is  0DAD53E0
问题是更改代码似乎没有任何区别-因此此代码:

String apkPath = App.getContext().getPackageCodePath();
Log.i("Checksum", "getting checksum for " + apkPath);
Long chksum = null;
Log.i("Checksum", "Size: " + new File(apkPath).length());
Log.i("Checksum", "Date: " + new Date(new File(apkPath).lastModified()));

//do something differently
Log.i("Checksum", "And now do something else!");
Toast toast = Toast.makeText(getApplicationContext(), "I'm doing something else!", Toast.LENGTH_SHORT);
toast.show();

try {
    // Open the file and build a CRC32 checksum.
    FileInputStream fis = new FileInputStream(new File(apkPath));
    CRC32 chk = new CRC32();
    CheckedInputStream cis = new CheckedInputStream(fis, chk);
    byte[] buff = new byte[80];
    while (cis.read(buff) >= 0) ;
    chksum = chk.getValue();
} catch (Exception e) {
    e.printStackTrace();
}
Log.i("Checksum", "Checksum is  " + String.format("%08X", chksum));
生成此输出:

09-27 15:45:51.085 29517-29517/com.test.checksum.checksum I/Checksum: getting checksum for /data/app/com.test.checksum.checksum-2/base.apk
09-27 15:45:51.085 29517-29517/com.test.checksum.checksum I/Checksum: Size: 3245610
09-27 15:45:51.085 29517-29517/com.test.checksum.checksum I/Checksum: Date: Wed Sep 27 15:45:30 BST 2017
09-27 15:45:51.085 29517-29517/com.test.checksum.checksum I/Checksum: And now do something else!
09-27 15:45:52.335 29517-29517/com.test.checksum.checksum I/Checksum: Checksum is  0DAD53E0
有人知道发生了什么事吗?所有的代码都存在于这个APK文件中,还是还有更多?如果我使用
File().list()
,那么我会得到一堆包含XML文件的文件夹,我最终会将它们包含在校验和中,但是APK文件是隐藏的,除非我直接按名称访问它

谢谢


Ben.

校验和应该从流中提取。i、 例如,要获得长值:

cis.getChecksum().getValue()

您所做的是从一个从未更改的新实例化的CRC32对象获取相同的长值

通常,流是这样创建的:

CheckedInputStream cis=新的CheckedInputStream(fis,新的CRC32())


也就是说,传入的校验和不是“out”变量。一旦计算完毕,您必须从流中提取校验和。

校验和应该从流中提取。i、 例如,要获得长值:

cis.getChecksum().getValue()

您所做的是从一个从未更改的新实例化的CRC32对象获取相同的长值

通常,流是这样创建的:

CheckedInputStream cis=新的CheckedInputStream(fis,新的CRC32())


也就是说,传入的校验和不是“out”变量。一旦它被计算出来,你就必须从流中获取它。

这似乎与在调试器中运行有关-即使有JDV的更改,我仍然每次得到0DAD53E0作为校验和,有趣的是每次都看到相同的文件长度

如果我用稍微不同的代码构建两个APK文件并手动安装它们,那么一切似乎都很好-安装每个APK文件会给出一个单独的校验和,但每个文件的校验和是一致的

我只能假设Android Studio调试器安装标准或核心APK文件,并在调试器中运行时从其他地方加载代码,如Visual Studio的.vshost.exe文件

谢谢你抽出时间


Ben.

这似乎与在调试器中运行有关-即使有JDV的更改,我仍然每次都得到0DAD53E0作为校验和,有趣的是每次都看到相同的文件长度

如果我用稍微不同的代码构建两个APK文件并手动安装它们,那么一切似乎都很好-安装每个APK文件会给出一个单独的校验和,但每个文件的校验和是一致的

我只能假设Android Studio调试器安装标准或核心APK文件,并在调试器中运行时从其他地方加载代码,如Visual Studio的.vshost.exe文件

谢谢你抽出时间


本。

谢谢你的帮助-它看起来更整洁,而且肯定更像机器人。不幸的是,我遇到了完全相同的问题,但我认为我已经找到了答案(或至少找到了解决方案),这与调试器有关。为了整洁,我会写一个单独的答案。谢谢你的帮助-它看起来更整洁,而且肯定更像Android。不幸的是,我遇到了完全相同的问题,但我认为我已经找到了答案(或至少找到了解决方案),这与调试器有关。为了整洁起见,我会写一个单独的回答。可能是“即时跑步”。可能是“即时跑步”。
09-27 15:45:51.085 29517-29517/com.test.checksum.checksum I/Checksum: getting checksum for /data/app/com.test.checksum.checksum-2/base.apk
09-27 15:45:51.085 29517-29517/com.test.checksum.checksum I/Checksum: Size: 3245610
09-27 15:45:51.085 29517-29517/com.test.checksum.checksum I/Checksum: Date: Wed Sep 27 15:45:30 BST 2017
09-27 15:45:51.085 29517-29517/com.test.checksum.checksum I/Checksum: And now do something else!
09-27 15:45:52.335 29517-29517/com.test.checksum.checksum I/Checksum: Checksum is  0DAD53E0