📅  最后修改于: 2023-12-03 15:37:17.677000             🧑  作者: Mango
SafetyNet是一项由Google提供的服务,允许开发人员在其应用程序中检查设备和用户行为是否符合安全最佳实践。 SafetyNet提供了一些API,可以帮助开发人员保护其应用程序免受欺诈和恶意攻击。
安全检查是SafetyNet API的一个组件,允许开发人员验证设备是否通过了Google的安全测试。 通过执行安全检查,应用程序可以确定设备是否被rooted、被篡改、是否使用伪装设备等。
在这篇文章中,我们将学习如何在Android中创建一个Safety Net Checker应用程序,它将显示设备的安全状态,并提供一些提示来帮助用户提高安全性。
要开始,需要确保你已经了解了以下内容:
如果你已经掌握了这些技术,接下来就可以开始了。
首先,在Android Studio中创建一个新项目。 为了简单起见,我们将使用一个空活动,该活动将包含检查器组件。 你可以根据需要添加其他组件。
请按照以下步骤操作:
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);
}
}
让我们看一下代码中一些关键组件的工作原理。
首先,在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对象中提供的以下属性:
然后,我们使用updateResultTextView()方法将结果告知用户。
最后,我们在布局文件中添加一个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