使用 Java 生成 Chrome 打包应用程序 .crx 标头

Posted

技术标签:

【中文标题】使用 Java 生成 Chrome 打包应用程序 .crx 标头【英文标题】:Generating Chrome Packaged App .crx header with Java 【发布时间】:2014-07-09 18:23:53 【问题描述】:

我正在尝试用 Java 构建标头,但没有运气。 (这里是规格:https://developer.chrome.com/extensions/crx) 有什么想法吗?

protected void geneateCrxHeader (OutputStream ins,byte[] zipArchive) throws NoSuchAlgorithmException, NoSuchProviderException, IOException, InvalidKeyException, SignatureException


    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");      
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
    keyGen.initialize(1024, random);        

    KeyPair pair = keyGen.generateKeyPair();
    byte[] key = pair.getPublic().getEncoded();     

    Signature instance = Signature.getInstance("SHA1withRSA");
    instance.initSign(pair.getPrivate());
    instance.update(zipArchive);                        
    byte[] hash = instance.sign();              
 byte[] magic = 0x43,0x72,0x32,0x34,0x02,0x00,0x00,0x00,0x00,0x01,0x0E,0x0B,0x00,0x00,0x08,0x00;

    ins.write(magic);
    ins.write(key);
    ins.write(hash);

我得到 CRX_EXCESSIVELY_LARGE_KEY_OR_SIGNATURE.. 我一定是使用了错误的keygen。

在他们确实说的文档中: "..作者的 RSA 公钥的内容,格式为 X509 SubjectPublicKeyInfo 块。.." 我想知道这是否是我做的不对...

p.s Java 加密对我来说是一个新领域,所以如果我做了一些完全愚蠢的事情,请不要笑。

【问题讨论】:

您的公钥长度和签名长度似乎是硬编码的。您从哪里获得用于公钥长度的字节 0x00,0x01,0x0E,0x0B 我尝试表示 491 字节长度。但我更喜欢下面的解决方案。不知道你可以做“headerBuf.order(ByteOrder.LITTLE_ENDIAN);”现在我知道了:) def。今天学到了一些东西。我会在一段真正的代码中尝试一下。 【参考方案1】:

下面是一些我编写但没有测试的代码,它说明了只生成标题。我仅基于阅读规范。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Signature;

    public static byte[] generateCrxHeader(byte[] extensionContents) throws Exception 
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");      
        SecureRandom random = new SecureRandom();
        keyGen.initialize(1024, random);        

        KeyPair pair = keyGen.generateKeyPair();

        Signature sigInstance = Signature.getInstance("SHA1withRSA");
        sigInstance.initSign(pair.getPrivate());
        sigInstance.update(extensionContents);
        byte [] signature = sigInstance.sign();
        byte [] subjectPublicKeyInfo = pair.getPublic().getEncoded();
        final int headerLength = 4 + 4 + 4 + 4 + subjectPublicKeyInfo.length + signature.length;
        ByteBuffer headerBuf = ByteBuffer.allocate(headerLength);
        headerBuf.order(ByteOrder.LITTLE_ENDIAN);
        headerBuf.put(new byte[]0x43,0x72,0x32,0x34); // Magic number
        headerBuf.putInt(2); // Version
        headerBuf.putInt(subjectPublicKeyInfo.length); // public key length
        headerBuf.putInt(signature.length); // signature length
        headerBuf.put(subjectPublicKeyInfo);
        headerBuf.put(signature);
        final byte [] header = headerBuf.array();
        return header;
    

【讨论】:

就是这样!!!!!!!谢谢你 。笨拙的 byte[] 是我的工作。使用 ByteBuffer 是这里的关键。我确信我使用了错误的加密算法。

以上是关于使用 Java 生成 Chrome 打包应用程序 .crx 标头的主要内容,如果未能解决你的问题,请参考以下文章

android app 打包流程

打包java程序生成exe

chrome打包程序

在浏览器选项卡内运行 Chrome 打包应用程序

调试新的 Chrome 打包应用

仅使用命令行界面在服务器上打包Chrome扩展程序