有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用KeyHash签名作为安全SSL连接上的post参数

在我的应用程序中,我有两种类型的内容:免费和应用程序内产品。 我通过简单的http连接获得免费产品信息,但对于应用内产品,我使用httpS并将其作为POST参数,每次我从下面的方法生成KeyHash,并在删除应用程序日志之前,在服务器上用日志打印中的同一方法获得的密钥进行检查

我知道调试签名的APK和发布签名的APK会产生不同的密钥散列,我使用发布的APK中正确的密钥散列

我对KeyHash有这些假设,我真的很想在将我的应用程序发布到野外之前确保我的假设是正确的

1-如果解包并反编译我的APK类,没有人可以生成相同的密钥散列,因为为了生成相同的密钥散列,他们需要我的证书密钥,而他们并不拥有。 除了那些不实用的暴力手段

2-如果我以后更新我的应用程序,这个密钥哈希不会因为更改类名或包或添加新的类名或包而改变。我对此进行了测试,每次都得到了相同的密钥哈希签名

3-攻击者没有其他已知的方法来发现这个密钥散列

我不得不说,我对所有这些证书和签名的东西感到有点困惑,我不确定生成的KeyHash签名和我的apk签名证书或apk的包结构之间有什么关系。 如果有人告诉我这个密钥哈希是什么,我会很感激的


编辑(澄清):我的目标是保护我的产品。我不希望任何人可以通过知道我的URL的POST参数来访问它们,如果他们反编译我的类。因此,我没有将post参数放入字符串中,而是从该方法中获取它


生成密钥散列的方法:

public String validateAppSignature(Context context) throws PackageManager.NameNotFoundException, NoSuchAlgorithmException {

        String currentSignature = "";
        PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
                context.getPackageName(), PackageManager.GET_SIGNATURES);
        for (Signature signature : packageInfo.signatures) {
            byte[] signatureBytes = signature.toByteArray();
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            currentSignature = Base64.encodeToString(md.digest(), Base64.DEFAULT);

            Log.d("REMOVED_LOG", "\n" + currentSignature);
        }

        return currentSignature;
    }

同样关于我的httpS连接,目前,我使用我的自签名证书作为服务器的httpS,并将BKS版本的证书放入原始文件夹中,以便Java的“HttpsURLConnection”接受。 我的应用程序是否因为使用SSL自签名证书而存在重大安全漏洞


共 (0) 个答案