私はAndroidアプリを開発中です。データ認証にはjava Signature
classを使用する必要があります。RSA署名付きSHA256は、さまざまなAndroidデバイスで異なる出力を返します
各Android搭載端末で、データに署名してその署名を確認できます。しかし、署名するデータの明確な塊、明確なモジュラス、明確なプライベート指数および明確な公開指数を仮定すると、デバイスによっては、私の署名の出力が異なります。私はたくさんのデバイスを試してみましたが、Android 3.2と3.2.1では同じシグネチャを取得しましたが、Android 2.2.xデバイスとは異なるシグネチャを取得しました。
これまでに生成した定数フィールドの署名を、JavaプロジェクトのRSAでKeyFactory
を使用して計算します。キーサイズは2048ビットです。
ここでは、私がinvoque Signature and Verificationに使用するコードを引用しています。
public byte[] signData(byte[] data, PrivateKey privateKey) throws ... {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data);
return signature.sign();
}
public boolean verifyData(byte[] data, byte[] sigBytes, PublicKey publicKey) throws ... {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(data);
return signature.verify(sigBytes);
}
私が誤解していない場合、RSAでSHA256を使用した署名は確定的です。それでは、どうやってそのような行動を説明できますか?もう1つ興味深い質問ですが、私はどのようにしてそのデバイスをクロスデバイスにすることができますか?つまり、署名は同じになります。
ありがとうございました、フランク!
エラーハンドラを貼り付けることはほとんど必要ありませんでしたが、コードは正しいように見えます。署名する鍵とデータが同じであることを確認してください。 –
@SevaAlekseyevはい、私は自分のシステムのすべての入力が同じであると確信しています。これらの定数を含むクラスでは、static finalとしてハードコーディングしました。私は便宜的に定数値をリンクしていませんでした。 – franckysnow
ステップごとにデバッグします。まず、すべてのプラットフォームでSHA256ハッシュを計算し、それらを比較します。 –