【问题标题】:Loading private key from string or resource in Java JSch in Android app在Android应用程序中从Java JSch中的字符串或资源加载私钥
【发布时间】:2023-03-19 00:24:01
【问题描述】:

我正在编写一个应用程序,它应该使用 JSch 通过 SSH 访问我的私人服务器。由于我已经设置了公钥身份验证,我希望这个应用程序以相同的方式进行身份验证。我将是唯一使用此应用程序的人,因此我想将我的密钥直接存储在应用程序中(例如硬编码)或分隔在手机主目录中的某个位置。哪个是最好的存储方式,也许是项目中的资源文件?由于我对 Android 开发还很陌生,所以我不确定什么是最好的方法。

我尝试过的:

// [...]
String user = "my_user";
String ssh_pwd = "my_pwd";
String host = "my_host";
// stored as OpenSSH key - file not found error - where shoud I move this file?
String private_key = "./my_pk";

int port = 22;

// basic SSH connection stuff
JSch jsch = new JSch();
session = jsch.getSession(user, host, port);
jsch.addIdentity(private_key, ssh_pwd.getBytes());

另一种方式:

// [...]
// private key in OpenSSH format as a plain string
String private_key = "xyz123abc456def789ghi012..."; 
// public key in OpenSSH format as a plain string
String public_key = "a1b2c3d4e5..."; 
// [...]
jsch.addIdentity("id_rsa", private_key.getBytes(), public_key.getBytes(), ssh_pwd.getBytes());

后者导致 “invalid privatekey” 错误。除此之外,我不确定两者中哪一个更安全。

提前致谢。

【问题讨论】:

  • 您应该将机密存储在Android Keychain 中。在您的情况下,密钥应该在文件系统上加密。然后,(1)提示用户输入密码;或 (2) 将密码存储在钥匙串中。如果始终存在交互式用户,则使用选项 (1)。选项 (2) 用于无人值守密钥存储,例如 wifi 密码。选项 (2) 可能是您的用例,但我们需要在此处详细了解您的服务的使用方式。

标签: java android ssh jsch


【解决方案1】:
String private_key = "xyz123abc456def789ghi012..."; // private key in OpenSSH format as a plain string
String public_key = "a1b2c3d4e5..."; // public key in OpenSSH format as a plain string

JSch.addIdentity(最终是KeyPair.load)采用一个缓冲区,其中包含由ssh-keygen(在最新版本的OpenSSH 中使用-m pem)生成的密钥对文件的内容。

格式如下:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAvc04a8wViYV5Kb4jX+MxEqN1vi9q9C7mPhf6DV+mb1ADNAiR
YeLqPMLCYUF2ViobcGfarb51gz7iB2TgkDmhQNK9XDCOUaGYN/FeZcN0JpzkjEjZ
ApbRfshj1h9qKQUW+38XKnltMtf4dxiuxkXph8P6IMVveTDs3sSbBPq560bdJ1AD
...
PEyVxlat2I4ShuLQiO1QIuS8ABu5yDM2EouB6vlxtGEBpIJItp7cyA==
-----END RSA PRIVATE KEY-----
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9zThrzBWJhXkpviNf4zESo3W+L2r0LuY+F/oNX6ZvUAM0CJFh4uo8wsJhQXZWKhtwZ9qtvnWDPuIHZOCQOaFA0r1cMI5RoZg38V5lw3QmnOSMSNkCltF+yGPWH2opBRb7fxcqeW0y1/h3GK7GRemHw/ogxW95MOzexJsE+rnrRt0nUAOu4hHjL6G/nlvdJ1jjZ06NwhYkbAxRoJkHUJTtMT2IL5ZmdAf37KHSPqZS32pLxQDmPutZxpIwlhz4aR78ZGp4+57mR069Y4at09GF0UmgtIiLjlKUexMf5sueVQ8LKhME6vOupMzTbiFEB3UJNq8d9Yx5i+c/IRHUIcI1 marti@MartinuvOmen

这不是private_keypublic_key 中的格式。


另见JSch to add private key from a string

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多