📜  在 Android 中创建 Safety Net Checker 应用程序(1)

📅  最后修改于: 2023-12-03 15:37:17.677000             🧑  作者: Mango

在 Android 中创建 Safety Net Checker 应用程序

介绍

SafetyNet是一项由Google提供的服务,允许开发人员在其应用程序中检查设备和用户行为是否符合安全最佳实践。 SafetyNet提供了一些API,可以帮助开发人员保护其应用程序免受欺诈和恶意攻击。

安全检查是SafetyNet API的一个组件,允许开发人员验证设备是否通过了Google的安全测试。 通过执行安全检查,应用程序可以确定设备是否被rooted、被篡改、是否使用伪装设备等。

在这篇文章中,我们将学习如何在Android中创建一个Safety Net Checker应用程序,它将显示设备的安全状态,并提供一些提示来帮助用户提高安全性。

准备工作

要开始,需要确保你已经了解了以下内容:

  • 开发Android应用程序的基本知识。
  • 了解Android Studio和Gradle构建系统。
  • 了解如何使用Android的布局和视图。
  • 了解如何使用网络API和访问设备信息。

如果你已经掌握了这些技术,接下来就可以开始了。

创建项目

首先,在Android Studio中创建一个新项目。 为了简单起见,我们将使用一个空活动,该活动将包含检查器组件。 你可以根据需要添加其他组件。

请按照以下步骤操作:

  1. 在Android Studio中创建新的空活动项目。
  2. 在项目结构中,打开MainActivity.java文件。
  3. 为该类添加必要的代码。
package com.example.safetynetchecker;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.safetynet.SafetyNet;
import com.google.android.gms.safetynet.SafetyNetApi;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    private static final String TAG = "SafetyNet Checker";
    private TextView mResultTextView;
    private GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mResultTextView = findViewById(R.id.resultTextView);
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(SafetyNet.API)
                .build();
    }

    @Override
    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mGoogleApiClient.disconnect();
    }

    @Override
    public void onConnected(Bundle bundle) {
        // Perform SafetyNet API check
        SafetyNet.SafetyNetApi.verifyWithRecaptcha(mGoogleApiClient, "YOUR_API_SECRET_KEY")
                .setResultCallback(new SafetyNetResultCallback());
    }

    @Override
    public void onConnectionSuspended(int i) {
        // Handle suspended connection
        Log.d(TAG, "Connection suspended: " + i);
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        // Handle failed connection
        Log.e(TAG, "Connection failed: " + connectionResult.getErrorCode());
    }

    private class SafetyNetResultCallback implements SafetyNetApi.RecaptchaTokenResultCallback {

        @Override
        public void onResult(SafetyNetApi.RecaptchaTokenResult recaptchaTokenResult) {
            CommonStatusCodes status = recaptchaTokenResult.getStatus();
            boolean success = recaptchaTokenResult.isSuccess();
            String result = recaptchaTokenResult.getTokenResult();

            // Display device safety status
            updateResultTextView(success, result);
        }
    }

    private void updateResultTextView(boolean success, String result) {
        String status = success ? "Device is secure" : "Device not secure";
        mResultTextView.setText(status + "\nToken: " + result);
    }
}

让我们看一下代码中一些关键组件的工作原理。

连接到 SafetyNet API

首先,在MainActivity中创建一个GoogleApiClient实例,并在onCreate()方法中建立连接:

mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(SafetyNet.API)
        .build();

在onStart()方法中,我们将GoogleApiClient实例连接到Google Play服务:

@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

在onStop()方法中,我们将它断开连接:

@Override
protected void onStop() {
    super.onStop();
    mGoogleApiClient.disconnect();
}

接下来,我们实现GoogleApiClient.ConnectionCallbacks和GoogleApiClient.OnConnectionFailedListener接口。 这些接口允许我们获取关于连接状态的通知,并在发生连接失败或暂停时执行适当的操作。

public class MainActivity extends AppCompatActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

        //...
}
执行检查

在onConnected()方法中,我们使用 SafetyNet.SafetyNetApi.verifyWithRecaptcha()方法执行 SafetyNet reCAPTCHA API检查。

@Override
public void onConnected(Bundle bundle) {
    SafetyNet.SafetyNetApi.verifyWithRecaptcha(mGoogleApiClient, "YOUR_API_SECRET_KEY")
            .setResultCallback(new SafetyNetResultCallback());
}

要使用此API,您需要自己生成一个API Secret key。 将此密钥传递给verifyWithRecaptcha()方法,以便检查可以执行。

处理结果

当检查完成时,SafetyNet API将结果返回给 SafetyNetResultCallback。 我们在此回调方法中检查结果Bool值,以确定是否通过了测试。

private class SafetyNetResultCallback implements SafetyNetApi.RecaptchaTokenResultCallback {

    @Override
    public void onResult(SafetyNetApi.RecaptchaTokenResult recaptchaTokenResult) {

        CommonStatusCodes status = recaptchaTokenResult.getStatus();
        boolean success = recaptchaTokenResult.isSuccess();
        String result = recaptchaTokenResult.getTokenResult();

        // Display device safety status
        updateResultTextView(success, result);
    }
}

在此方法中,我们使用SfetyNetApi.RecaptchaTokenResult对象中提供的以下属性:

  • status: API请求状态。
  • success: 指示设备是否通过了安全测试。
  • tokenResult: API返回的字符串,用于生成reCAPTCHA验证。

然后,我们使用updateResultTextView()方法将结果告知用户。

更新UI

最后,我们在布局文件中添加一个TextView,用于显示设备安全状态和reCAPTCHA验证结果。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:padding="16dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/resultTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:textSize="22sp"/>
</LinearLayout>

接下来,我们在代码中实现updateResultTextView()方法。 此方法将设备状态信息更新到 TextView 组件中,以向用户显示安全状态。

private void updateResultTextView(boolean success, String result) {
    String status = success ? "Device is secure" : "Device not secure";
    mResultTextView.setText(status + "\nToken: " + result);
}
结论

现在,我们已经了解了如何在Android中创建一个SafetyNet Checker应用程序,用于检查Android设备的安全性。 通过使用SafetyNet API,我们可以检测是否存在欺诈和恶意行为,并提示用户如何提高安全性。这可以使您的应用程序更安全,避免恶意攻击和损失。

完整的源代码可以在我的GitHub上找到: https://github.com/KahiruPrabuddha/SafetyNet-Checker-App