当前位置: 首页 > 面试题库 >

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

龙高歌
2023-03-14
问题内容

如何使用系统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();
    }
}


 类似资料:
  • 问题内容: 由于需要执行一些服务器端代码-主要是发送电子邮件,因此我决定将Nodejs&Express与Firebase一起用于服务器端元素以保存数据- 部分是出于学习经验。 我的问题是,在使用简单电子邮件和密码API进行身份验证时,使用客户端Firebase库和Nodejs库的最佳方法是什么?如果我执行身份验证客户端,然后随后在NodeJS端调用其他路由,则该用户的身份验证将在请求中进行。在No

  • 我想将以下XML发布到web服务:- 我希望得到以下响应XML:-

  • 我正在使用Activiti7,我想禁用activiti安全性。我尝试重写WebSecurityConfigurerAdapter配置方法,但它不起作用

  • 问题内容: 我问自己,例如Selenium是否有可能确保Selenium Grid中的通信安全。据我所知,Selenium通过JSON和Selenese命令进行通信。但是它没有被加密。是否可以加密通信? 非常感谢。 问题答案: 快速攻克:建立ssh隧道。 使用以下ssh命令将远程服务器的端口4444转发为本地端口: ssh user @ remotesrv -L 4444:127.0.0.1:44

  • 默认情况下,所有敏感的HTTP端点都是安全的,只有具有Actuator角色的用户才能访问它们。安全性是使用标准的HTTPServletRequest.isUserInRole方法实施的。我们可以使用management.security.enable = false来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。

  • 当我使用security.basic.enabled=false在具有以下依赖项的Spring Boot项目上禁用安全性时: 为了修复此异常,我必须添加属性-management.security.enabled=false。我的理解是,当执行器在类路径中时,应该将security.basic.enabled=false和management.security.enabled=false设置为禁用