大多数应用开发者会将一些第三方库集成到他们的应用中.如果要访问服务,例如Dropbox或YouTube,或者用于记录崩溃.第三方图书馆和服务的数量是惊人的.大多数这些库和服务都是以某种方式通过服务进行身份验证而集成的,大部分时间都是通过API密钥进行的.出于安全目的,服务通常生成公共和私有(通常也称为秘密密钥).不幸的是,为了连接到服务,必须使用此私钥进行身份验证,因此可能是应用程序的一部分.毋庸置疑,这面临着巨大的安全问题.公共和私人API密钥可以在几分钟内从APK中提取,并且可以轻松实现自动化.
假设我有类似的东西,我该如何保护密钥:
public class DropboxService {
private final static String APP_KEY = "jk433g34hg3";
private final static String APP_SECRET = "987dwdqwdqw90";
private final static AccessType ACCESS_TYPE = AccessType.DROPBOX;
// SOME MORE CODE HERE
}
Run Code Online (Sandbox Code Playgroud)
您认为存储私钥的最佳和最安全的方式是什么?混淆,加密,你怎么看?
我正在开发一个Android应用程序作为项目的一部分,并使用Google place API根据位置显示感兴趣的地方.我正在使用PlacePicker Inentbuilder来实现这一目标.
但是,当应用程序运行时,位置选择器启动然后立即关闭(大约1-2秒).
我已经实现了以下建议(我从其他答案得到):
我已经为Android应用程序生成了公共API密钥,并将其包含在应用程序清单中的元数据标记中.
我在开发者控制台上启用了"Google Places API for android"API.
我在build.gradle中包含了最新的play服务版本的依赖项.
我已将我的代码和logcat包含在下面.如果我需要包含其他任何内容,请告诉我.
的Manifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sampath.project.project_v2" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.geo.api_key"
android:value="@string/google_api_key" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/google_api_key" />"
<activity
android:name=".LoginActivity"
android:label="@string/title_activity_login" >
</activity>
<activity
android:name=".PlacesSample"
android:label="@string/title_activity_places_sample" >
<meta-data
android:name="com.google.android.geo.api_key"
android:value="@string/google_api_key" />
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
Build.gradle(app模块 - 这是唯一的模块)
apply plugin: …Run Code Online (Sandbox Code Playgroud) 这可能是一个新手问题,但我会尝试创建一个有趣的辩论。
我知道有一些用于 API 基本身份验证、API 密钥、OAuth 2.0 的身份验证方法……所有这些方法都会在请求中添加标头或 formData 参数。
尽管您使用 SSL,但破解移动应用程序“通常很容易”(我现在正在考虑使用 Android:反编译应用程序、更改清单以允许自定义 SSL、再次编译并通过 SSL 代理嗅探所有请求)。
在这些请求中,我发现了很多身份验证密钥,我可以在控制台的其他调用中使用它们,毫无问题地模拟应用程序。
所以,现在我已经在移动应用程序中破解了一些 API,我的问题是:有没有办法保护移动应用程序中的 API?
我想知道一个安全层会限制每个“密钥”的请求数量。
我错了吗 ?我错过了什么吗?这是一个愚蠢的问题吗?
是否有一个Android等效的ios设备检查 https://developer.apple.com/documentation/devicecheck 或任何方式来验证这是你的unoctored apk进行api调用?