SFTP с ключами, не основанными на файлах - PullRequest
1 голос
/ 04 декабря 2010

Я планирую написать некоторое программное обеспечение, использующее SFTP с аутентификацией с открытым / закрытым ключом для загрузки файлов на сервер. Мне интересно, как люди рекомендуют управлять ключами (особенно закрытым ключом).

Моя целевая платформа - Windows с C # или C ++. Я посмотрел на несколько библиотек:

C #
(Свободное / открытое)
SharpSSH
Granados

(коммерческий)
Rebex

C ++
Libcurl / OpenSSH

Похоже, что все они требуют, чтобы закрытый ключ хранился в файловой системе, чего я предпочел бы избежать по соображениям безопасности. Я также предпочел бы не реализовывать аутентификацию самостоятельно, хотя я признаю это как вариант. Мои вопросы:

Есть ли способ передать любую из этих библиотек (или любую библиотеку / API, которую я, возможно, пропустил) значениям ключей непосредственно из памяти вместо загрузки из файла?

Если нет, каков рекомендуемый способ управления этими ключевыми файлами? Помимо шифрования пароля и строгого контроля доступа, нужно ли что-то делать для защиты файла ключа?

Ответы [ 4 ]

3 голосов
/ 05 декабря 2010

Похоже, что все они требуют, чтобы закрытый ключ хранился в файловой системе, чего я бы предпочел избегать по соображениям безопасности.Современные, такие как NTFS (которую вы почти наверняка используете в качестве разработчика Windows) имеют надежные механизмы безопасности, которые, вероятно, лучше продуманы, чем большинство альтернативных механизмов, которые вы (или я) можете придумать.NTFS имеет списки контроля доступа, шифрование и т. Д. - если вы не можете доверять своей файловой системе для обеспечения безопасности ваших данных, почему вы вообще беспокоитесь о сетевом трафике?

Я отмечу, что естьнекоторые конкретные обстоятельства, которые могут помешать делать то, что я сказал выше, но я не вижу ни одного из них, упомянутых в оригинальном сообщении.

0 голосов
/ 08 декабря 2010

Следующий код показывает, как пройти аутентификацию с использованием закрытого ключа, используя Rebex SFTP .

Код взят из следующего сообщения на форуме .Для получения дополнительной информации проверьте SFTP учебник .

// create client and connect 
Sftp client = new Sftp();
client.Connect(hostname);

// instead of loading it from disk file load the private key from a byte array
//SshPrivateKey privateKey = new SshPrivateKey("key_rsa.pem", "password");

byte[] privateKeyData = YourMethodForObtainingPrivateKey();    
SshPrivateKey privateKey = new SshPrivateKey(privateKeyData, "password");

// authenticate 
client.Login(username, privateKey);

// ... 
0 голосов
/ 04 декабря 2010

SFTP-классы SecureBlackbox (наш продукт) позволяют загружать ключ из любого потока или байтового массива. Кроме того, они также позволяют генерировать и преобразовывать ключи SSH в различных форматах.

Если у вас есть вопросы, мы предоставляем поддержку для оценки пользователей через Форум и HelpDesk

0 голосов
/ 04 декабря 2010

Я никогда не использовал Granados, но класс SSH2UserAuthKey этой библиотеки имеет метод FromSECSHStyleStream, который загружает ключ аутентификации пользователя из произвольного Stream (который может быть MemoryStream, если вы хотите загрузить ключ прямо из памяти). Похоже, это позволит вам обойти файловую систему для хранения ключей.

Rebex.Net имеет конструктор класса SshPrivateKey , который может загружаться из byte[]; это также позволит вам избежать файловой системы.

Хотя я не проверял другие библиотеки, представляется вероятным, что все они предоставляют методы для загрузки ключа из byte[], MemoryStream или unsigned char*, с удобными методами, которые загружаются непосредственно из файл.

Эти API не решают проблему того, как на самом деле будет храниться закрытый ключ. Вы можете защитить его паролем (это кажется довольно распространенным подходом к закрытым ключам SSH) или использовать класс ProtectedData , чтобы зашифровать его с использованием учетных данных текущего пользователя Windows.

...