在Java安全性中使用authorized_keys中的公钥

如何使用系统authorized_keys文件中的条目进行java.security.PublicKey实施?我特别想比较来自authorized_keys文件中的公共密钥和Apache

SSHD PublickeyAuthenticator界面中可用的公共密钥。

回答:

令我惊讶的是,那里没有明显的东西。我很好奇,并实现了一种解码authorized_keys文件的方法。这取决于用于Base64解码的Apache

Commons Codec。

import java.io.File;

import java.math.BigInteger;

import java.security.KeyFactory;

import java.security.PublicKey;

import java.security.spec.DSAPublicKeySpec;

import java.security.spec.RSAPublicKeySpec;

import java.util.Scanner;

import org.apache.commons.codec.binary.Base64;

public class AuthorizedKeysDecoder {

private byte[] bytes;

private int pos;

public PublicKey decodePublicKey(String keyLine) throws Exception {

bytes = null;

pos = 0;

// look for the Base64 encoded part of the line to decode

// both ssh-rsa and ssh-dss begin with "AAAA" due to the length bytes

for (String part : keyLine.split(" ")) {

if (part.startsWith("AAAA")) {

bytes = Base64.decodeBase64(part);

break;

}

}

if (bytes == null) {

throw new IllegalArgumentException("no Base64 part to decode");

}

String type = decodeType();

if (type.equals("ssh-rsa")) {

BigInteger e = decodeBigInt();

BigInteger m = decodeBigInt();

RSAPublicKeySpec spec = new RSAPublicKeySpec(m, e);

return KeyFactory.getInstance("RSA").generatePublic(spec);

} else if (type.equals("ssh-dss")) {

BigInteger p = decodeBigInt();

BigInteger q = decodeBigInt();

BigInteger g = decodeBigInt();

BigInteger y = decodeBigInt();

DSAPublicKeySpec spec = new DSAPublicKeySpec(y, p, q, g);

return KeyFactory.getInstance("DSA").generatePublic(spec);

} else {

throw new IllegalArgumentException("unknown type " + type);

}

}

private String decodeType() {

int len = decodeInt();

String type = new String(bytes, pos, len);

pos += len;

return type;

}

private int decodeInt() {

return ((bytes[pos++] & 0xFF) << 24) | ((bytes[pos++] & 0xFF) << 16)

| ((bytes[pos++] & 0xFF) << 8) | (bytes[pos++] & 0xFF);

}

private BigInteger decodeBigInt() {

int len = decodeInt();

byte[] bigIntBytes = new byte[len];

System.arraycopy(bytes, pos, bigIntBytes, 0, len);

pos += len;

return new BigInteger(bigIntBytes);

}

public static void main(String[] args) throws Exception {

AuthorizedKeysDecoder decoder = new AuthorizedKeysDecoder();

File file = new File("authorized_keys");

Scanner scanner = new Scanner(file).useDelimiter("\n");

while (scanner.hasNext()) {

System.out.println(decoder.decodePublicKey(scanner.next()));

}

scanner.close();

}

}

以上是 在Java安全性中使用authorized_keys中的公钥 的全部内容, 来源链接: utcz.com/qa/406896.html

回到顶部