gpt4 book ai didi

java - 使用 Robospice 在 Android 上固定证书

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:54 25 4
gpt4 key购买 nike

我正在阅读有关 Android 上的证书固定的信息,但我感到很困惑。我没有使用 okhttp 或 retrofit,所以我必须手动完成。这里有教程:https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#Android他们将证书添加到受信任证书列表的位置。但是当我们检查服务器上安装的证书的 sha256 的 base64 时,还有另一个教程:https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e哪种方法是正确的?为什么我们不能像浏览器那样在 header 中从服务器接收 sha256 并将其存储在某个地方?

最佳答案

我会推荐这个
https://www.paypal-engineering.com/2015/10/14/key-pinning-in-mobile-applications/

安卓方法

最简单的方法是使用基于 JSEE 的方法,如下所示。这是 Android 的推荐方法。该方法的输入参数是一个 HTTPS 连接和一组用于目标 URL 的有效引脚。


private boolean validatePinning(HttpsURLConnection conn, Set<String> validPins) {
try {
Certificate[] certs = conn.getServerCertificates();
MessageDigest md = MessageDigest.getInstance("SHA-256");
for (Certificate cert : certs) {
X509Certificate x509Certificate = (X509Certificate) cert;
byte[] key = x509Certificate.getPublicKey().getEncoded();
md.update(key, 0, key.length);
byte[] hashBytes = md.digest();
StringBuffer hexHash = new StringBuffer();
for (int i = 0; i < hashBytes.length; i++) {
int k = 0xFF & hashBytes[i];
String tmp = (k<16)? "0" : "";
tmp += Integer.toHexString(0xFF & hashBytes[i]);
hexHash.append(tmp);
}
if (validPins.contains(hexHash.toString())) {
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return false;
}

引脚被声明为字符串。例如:

声明键位

private static final Set<String> PINS = new HashSet<String>(Arrays.asList(
new String[]{
"996b510ce2380da9c738...87cb13c9ec409941",
"ba47e83b1ccf0939bb40d2...edf856ba892c06481a"}));

利用上述方法,这里有一个示例展示了如何使用它。唯一相关的部分在下面突出显示。

使用键固定的例子

protected String doInBackground(String... urls) {
try {
/** Test pinning given the target URL **/
/** for now use pre-defined endpoint URL instead or urls[0] **/
Log.i(LOG_TAG, "==> PinningTestTask launched.");
String dest = defaultEndpoint;
URL targetURL = new URL(dest);
HttpsURLConnection targetConnection = (HttpsURLConnection) targetURL.openConnection();
targetConnection.connect();
if (validatePinning(targetConnection, PINS)) {
final String updateText = "Key pinning succeded for: " + dest;
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(updateText);
}
});
} else {
final String updateText = "Key pinning failed for: " + dest;
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(updateText);
}
});
}
} catch (Exception e) {
e.printStackTrace();
final String updateText = "Key pinning failed for: " + dest + "\n" + e.toString();
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(updateText);
}
});
}
return null;
}

关于java - 使用 Robospice 在 Android 上固定证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44628151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com