使用 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 标头的主要内容,如果未能解决你的问题,请参考以下文章