android - 使用 OpenSSL 和 Android 时的不同 RSA 签名

标签 android security openssl digital-signature sha256

在翻阅了类似问题的 SO 之后,我还没有找到答案。

我正在用两者唱一个文件 openssl rsautl -sign ...openssl dgst -sign ... 这两个选项显然提供不同的输出。

我的问题是,当我使用以下方式在 Android 应用程序上签署我的文件时:

public byte[] signData(byte[] data, PrivateKey privateKey) {
    Signature signature = null;
    try {
        signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data);
        return signature.sign();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

这个函数返回一个完全不同的十六进制字符串。 以及android上的验证方式:

byte[] sigBytes = hexStringToByteArray(signature);    
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(spec);
Signature signCheck = Signature.getInstance("android ");
signCheck.initVerify(publicKey);
signCheck.update(data.getBytes("UTF-8"));
boolean isVerified = signCheck.verify(sigBytes);

只验证android应用生成的HEX字符串。

使用 openssl 命令(已尝试使用大部分可用参数)我似乎无法生成相同的 HEX 字符串。

仅供引用:我使用 RSA 和 SHA256 在 android 和命令行上登录。

从android我得到以下十六进制字符串:0A241F28C2C4CF8A71879FAFB9F16CF4908560B76BF2DDDB7757B7C5B150C4C5EE76E86D50CC237552E08F4C4154EB83BC9CEFF0E3540B515D1 31E711E8CE46E4EF8DFC941E0BAE1945FDB348D66839721D27F626E9869118A7EA0D181E367A19AF4335E44256F6DAB35B23871DC95CB47CDFC489852A093F9F25FCBC45 1FE90EEAD5D033C65FEE1CBF67D77581BF79F27A38574879A5B903D48D0C5705E1F8F0263F262D76B08A523A27AD4D8394050CEAC2EDD92021CCDB34038699AAA49B1B

从 openssl(openssl dgst -sha256 -binary -sign private.pem data.txt | hexdump),我得到:818DB0A4F8AE1A1374643E61CD835C38B9C78275E97F7D29CBB739E912C94F5B625FF3F9F9 16BE5A5D6BB6BBBA5B55D14C93CF5E53525471E135B92B8D30ED501F72429A5792CBA2B07EEF780515BD70226038E5A7567914EFA4D676685777C96AB1067BFBB2B95B2 FCCBACB5BD6D9E6723D22DB715DE1EF4284509620E0C540C8D08B367FA966245671C16D35ECA52CC0640C2C0C733989B7703922AC07D0817D2440A0C4640508FEE6CBC6 2221847D2893716A712292B701A5C65901D05636855D9D31253C1F53EF3E7B1741A460A0F7DEDCEF4CA4039AA5385B49BE486A6380488FB5A0DEEF8BDD0F70874866EF 6FC2EC4CFFC6BDD71271F1AE30112F8BD0

请帮忙,干杯。

最佳答案

我使用命令“openssl pkeyutl -sign ...”和 java 代码对字符串进行了不同的输出签名:

Signature sig = Signature.getInstance("SHA256withRSA");

最后换成这个指纹我得到了相同的输出:

Signature sig = Signature.getInstance("NONEwithRSA");

关于android - 使用 OpenSSL 和 Android 时的不同 RSA 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34134848/

相关文章:

java - Android 在绘制之前获取 View 的位图?

android - 存储用于跨设备同步的表格化用户数据 cordova 应用程序的最佳方法

security - 很好理解CSRF的棘手问题

python - 使用python进行时间戳查询

security - 创建自签名 SSL 证书时出错

android - Android SDK 未生成任何属性

android - 无法在android上使用C++ OpenCV打开相机

ssl - 具有 SAN 的 azure 网站 ssl 标识为 *.azurewebsites.net

android - 可信执行环境(TEE)中的客户端应用程序和可信应用程序

security - 当前用户是LocalSystem 检查?