简体   繁体   English

签名长度不正确:得到768但是在Java验证中期望为512

[英]Signature length not correct: got 768 but was expecting 512, in Java verify

I have already posted a similar question concerning how to load RSA keys in java. 我已经发布了一个类似的问题,关于如何在java中加载RSA密钥。 See the best response of this question to fully understand the first part of my code (the method getPulicKey, I mean). 请查看问题的最佳响应,以完全理解我的代码的第一部分(方法getPulicKey,我的意思是)。

private static PublicKey getPublicKey(String publicKey)
        throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
    try (PEMParser pp = new PEMParser(new StringReader(publicKey))) {
        SubjectPublicKeyInfo subjPubKeyInfo = (SubjectPublicKeyInfo) pp.readObject();
        RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(subjPubKeyInfo);

        RSAPublicKeySpec rsaSpec = new RSAPublicKeySpec(rsa.getModulus(), rsa.getExponent());
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PublicKey myKey = kf.generatePublic(rsaSpec);
        System.out.println(myKey);
        return myKey;
    }
}

The method verify (below) raises the following exception 方法验证(下面)引发以下异常

Signature length not correct: got 768 but was expecting 512, in Java verify 签名长度不正确:得到768但是在Java验证中期望为512

In the following code, I decode the signature because I suppose it is Base64, but I'm not sure, sorry. 在下面的代码中,我解码签名,因为我认为它是Base64,但我不确定,抱歉。 I don't know wether I could show you the signature and the object. 我不知道我能告诉你签名和对象。 The signature is a sequence of 1024 digits and numbers. 签名是1024个数字和数字的序列。 It does not end with "=". 它不以“=”结尾。 The object I have to verify is a json object in String format. 我必须验证的对象是String格式的json对象。 The following is the method I have written to verify a String object, given a sign and a publicKey. 以下是我编写的用于验证String对象的方法,给定了sign和publicKey。 It calls the above method getPublicKey(...). 它调用上面的方法getPublicKey(...)。

public static boolean verify(String object, String sign, String publicKey) throws NoSuchAlgorithmException,
        InvalidKeySpecException, IOException, InvalidKeyException, SignatureException {
    //object to be verified
    //sign is the signature stored in the postgres DB
    //publicKey is the public key stored in the postgres DB
    Signature signature = Signature.getInstance("SHA256withRSA");
    signature.initVerify(getPublicKey(publicKey));
    byte[] objectBytes = Base64.getEncoder().encode(object.getBytes("utf-8"));
    signature.update(objectBytes);
    byte[] signBytes = Base64.getDecoder().decode(sign.getBytes("utf-8"));
    System.out.println(signBytes.length); //this line prints 768, with decode. 1024, otherwhise
    return signature.verify(signBytes);
}

EDIT: 编辑:

My workmates are using the following two nodejs methods (verifySign and createSign). 我的同事正在使用以下两个nodejs方法(verifySign和createSign)。

In the following nodejs code (where there are workmates' methods), I encript with "createSign" the message "fake message". 在下面的nodejs代码中(有工作人员的方法),我在“createSign”中输入消息“假消息”。 The sign is the following: 标志如下:

Then, I verify it with public key pk (see below). 然后,我用公钥pk验证它(见下文)。

const PASSPHRASE_KEY = "...";
const crypto = require('crypto');

const prk = "...";

const pk = "-----BEGIN RSA PUBLIC KEY-----\r\n" + 
            "MIICCgKCAgEA1ht0OqZpP7d/05373OE7pB7yCVGNGzkUEuCneyfOzps6iA03NbvI\r\n" + 
            "1ZL0Jpp/N3AW73lGdhaoa3X3JE4GsI/bsToVLQwTKmIOC4yjTvBctmFEoyhhTfxW\r\n" + 
            "s1UHZKl4XZ/7THbRlKHhRaTKyfDAbikkMAxNT/qutLAPjnN1qOwjb1oRq52NP6FJ\r\n" + 
            "KWTTikz4UeOHroX+Xthn2fJSJDlQ4YMdBbgrZVx5JcHKNuPTKRf5gI8QQKMSA9Q9\r\n" + 
            "QJRE5OGp7b6dG14ZmOUnUxb00Mp20LgcaGPcuWU+oFsbQaF6W4G4bdkSZRJJXhSg\r\n" + 
            "d4Q7mahpar94/gnztJmth0GzqTWUYyZIWNqIFoMwuOgeaiDV43zb3uLsRVpRKYYy\r\n" + 
            "esmzcOy/jTScVLRCD8QRyu9B2wgCkNAVztQOXPCOOa4O1LlVQWaecIs4WPhOqDhi\r\n" + 
            "KTBhyVkpC1TrrBkp+QMqMqWll1OyVb6k/7uV0qE/i6rHJtjo5v9bcIgYzswyx9CD\r\n" + 
            "9PKl2Q0L0Jg7TMG+yLDIrLfGeuSeEc4XYJzN7bJcCeiizzu5iU9dQUkrncOrq9jn\r\n" + 
            "Ub2pM/+A+JqIsoPK3IY/pJKqH4JYpGKhO1iPQF6iXIZT1r3ZgJUSQtzSeyYqhkla\r\n" + 
            "2uR2BsbPbDqebCuXm3lAsY5w+dujijcn96PKwYha1LsK5sACHuJ79AMCAwEAAQ==\r\n" + 
            "-----END RSA PUBLIC KEY-----\r\n" + 
            "";

function createSign(pvt_key, data_unsigned) {
    //Create a SHA256 sign generator
    const signer = crypto.createSign('SHA256');

    //Update context with data to sign
    signer.update(data_unsigned);

    //Sign the document based to user's private key
    return signer.sign({
        key: pvt_key,
        passphrase: PASSPHRASE_KEY
        },
        'hex'
    );
}

function verifySign(pub_key, signed_data, signature) {
  const verifier = crypto.createVerify('sha256');

  //Update context with data to verify
  verifier.update(signed_data);

  //Verify sign with user's public key
  const verified = verifier.verify(
    pub_key,
    signature,
    'hex'
  );

  //Send result
  return verified;
}

const phrase = "fake message";
var signMade = createSign(prk, phrase);
console.log("my signature: " + signMade);
//The signature is 5f188225c68dee2ce8de588dfaccb667710da94abb5388deabfe3ad83f7a94a72ee4a3c8c51be26c5b58cdec8c82cf8135c478ad609b7985496e201b23de6c5d03e93dcd9df7b5e2315efbfd2ff6496b0aea3b425bb99c912a16aeb5efb6cefc1e175c32aaf16af3a2baca5b54f974af0f14c853228bc06410e7ad1b2b0ecec19f5aed151389bd9ccebd5e998159d5205d81a7c7e37b502df3eb5229a5fd3492680576ebfa1e76b7c47fb757a9bfb18aa9ea0b71512ab9e1afc8e551ebf6d74a042bd447233953efbf374a3a6a210ead2019b8cc8548bb304979b4bfdc90dce644cb109bbddb75dda9df1322fd8e08ef1144e870324f34d4c826d9a4b64be0442aedc6f3d5f571d7336af212825c4e0216aa5eabab6218d685a3e73d81693149b45af5f1857c4a0e50b396d1a2ea5a3effafcc4e124fd23d0427abfe5509357936ef5e7c7ca4476d6a5ae7a26e9563923a03d0780f0d897039d4d3aa2ce49dc84b31907a50045456acb57edd11a896632969245d0f97fd88dace7eb256099bbc4eedf52b5d53b481b2aeb829101d0089903ea9c3621bcbd763962b84ad57407623b576cc6a9c3328d85e0f7dd78565cd39a6648a68dd6f4334dd3a68e48491ae655601a5c9be7673ae0d3f955431fb21f33c0178ecb9067072a6b1e360ee77a45f8e855e6c545276aefc7ae70b5c7e0f1ec0b66460575e3386f8a4bbf7fd3704
console.log("was it me to sign that?");
var res = verifySign(pk, phrase, signMade);
console.log(res);

It returns true. 它返回true。 However, If I pass to the java method verify the following (same) parameters: 但是,如果我传递给java方法,请验证以下(相同)参数:

  1. object = "fake message" object =“假消息”
  2. sign = sign =
  3. publicKey copied from pk (see node code above) 从pk复制的publicKey(参见上面的节点代码)

java raises the exception: java引发了异常:

Signature length not correct: got 768 but was expecting 512 Signature lenght not correct. 签名长度不正确:得到768但是期待512签名长度不正确。

You're treating the signature as if it's base64-encoded, but it's not - it's just hex. 您将签名视为base64编码,但它不是 - 它只是十六进制。

1024 characters represents 768 base64-encoded bytes, or 512 hex-encoded bytes. 1024个字符表示768个base64编码的字节,或512个十六进制编码的字节。

Just decode using hex instead of base64 and it should be fine. 只需使用十六进制而不是base64进行解码,它应该没问题。

Hint that this is along the right lines, as well as observing that every character of your signature is a valid hex digit (which would be extremely unlikely if it's actually base64): 提示这是沿着正确的路线,以及观察签名的每个字符都是有效的十六进制数字(如果它实际上是base64则极不可能):

return signer.sign({
    key: pvt_key,
    passphrase: PASSPHRASE_KEY
    },
    'hex' // Note this use of 'hex'...
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 DockerforWindows :JenkinsInstallation:java.security.SignatureException:签名长度不正确:得到 512 但期待 256 - DockerforWindows : JenkinsInstallation : java.security.SignatureException: Signature length not correct: got 512 but was expecting 256 javax.xml.crypto.dsig.XMLSignatureException:java.security.SignatureException:签名长度不正确:得到128但期待512 - javax.xml.crypto.dsig.XMLSignatureException: java.security.SignatureException: Signature length not correct: got 128 but was expecting 512 无法使用已配置的PublicKey验证RSA签名。 签名长度不正确:达到255,但预期为256 - Unable to verify RSA signature using configured PublicKey. Signature length not correct: got 255 but was expecting 256 Signature.verify 抛出异常 Signature length not correct: got 248 but was expected 256 - Signature.verify is throwing an exception Signature length not correct: got 248 but was expecting 256 签名长度不正确:得到127但是期待128 - Signature length not correct: got 127 but was expecting 128 数字签名错误-签名长度不正确:达到344,但预期为256 - Digital Signature error - Signature length not correct: got 344 but was expecting 256 调用PGPOnePassSignature.verify时,签名长度不正确 - Signature length not correct when calling PGPOnePassSignature.verify 签名长度不正确 - Signature length not correct JAVA中的签名验证和签名长度 - Signature Verification in JAVA and Signature Length Groovy SSL签名验证:签名长度不正确? - Groovy SSL signature verification: signature length not correct?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM