Rに秘密データを安全に保存して使用する方法

スクリプトでこのデータを明示的に設定せずに、ログインとパスワードをRに安全に保存する方法についての質問が時々発生します。 いくつかの可能な解決策があると思います。 パラメータを保存できます:
  1. スクリプトで直接。
  2. 表示していないプロジェクトを含むフォルダー内のファイル。
  3. .Rprofileファイル内。
  4. .Renvironファイル内。
  5. JSONファイル。
  6. Rからアクセスしている安全な金庫
  7. ダイジェストパッケージを使用します。
  8. ナトリウムパッケージの使用。
  9. 安全なパッケージを使用します。

各アプローチの主なアイデア、利点(または欠点)を見てみましょう。
[翻訳者から:実用性の増加順。]

スクリプトで直接


最初のアプローチは、パラメータをスクリプトに直接保存することです。
id <- "my login name" pw <- "my password" call_service(id, pw, ...) 

その単純さにもかかわらず、明らかな欠点のために誰も真剣にこれを行うことを申し出ません。これらのパラメータも表示しないとコードを表示できません。

表示していないプロジェクトのあるフォルダー内のファイル


2番目のオプションは、ほぼ同じように簡単に実装できます。 アイデアは次のとおりです。たとえば、「keys.R」など、プロジェクトと同じフォルダー内の別のファイルにパラメーターを配置します。 次に、たとえばsource()を使用してパラメーターを読み取ることができます。 次に、バージョン管理システムから「keys.R」を除外します。 gitを使用している場合は、「gits.R」を.gitignore設定に追加できます。

欠点は、十分に注意しないと、このファイルを誤って表示する可能性があることです。
 # keys.R id <- "my login name" pw <- "my password" # script.R source("keys.R") call_service(id, pw, ...) 

.Rprofileファイル内


3番目のオプションは、パラメータを.Rprofileファイルの1つに保存することです。 このオプションは非常に人気があります:
別のフォルダにデータを保存できます。 プロジェクトフォルダーにはありません。 したがって、誤ってファイルへのアクセスを開く可能性は低くなります。

.Rprofileでは、通常のRコードを記述できます。
 # ~/.Rprofile id <- "my login name" pw <- "my password" # script.R # id  pw     .Rprofile call_service(id, pw, ...) 

.Rprofileで"id"および"pw"オブジェクトを定義することの欠点の1つは、それらがグローバル環境の一部になることです。 それらがそこにあれば、スクリプトから簡単に変更できます。 たとえば、 rm()を使用してグローバル環境をクリアすると、それらは削除されます。

同じメソッドのもう少し柔軟なバージョンも.Rprofileを使用しますが、環境変数としてパラメーターを宣言します。 Sys.setenv()を使用して環境変数を設定し、 Sys.setenv()を使用してSys.setenv()ことができます。
 # ~/.Rprofile Sys.setenv(id = "my login name") Sys.setenv(pw = "my password") # script.R # id  pw     .Rprofile call_service(id = Sys.getenv("id"), pw = Sys.getenv("pw"), ...) 

.Renvironファイル内


Rには、特別な外部ファイル.Renvironで環境変数を定義するメカニズムもあります。 .Renvironの操作は.Rprofileに似ています。 主な違いは、.Renvironでは、 Sys.setenv()を使用せずに変数を直接設定できることです。

環境変数は言語に依存しません。
 # ~/.Renviron id = "my login name" pw = "my password" # script.R # id  pw     .Renviron call_service(id = Sys.getenv("id"), pw = Sys.getenv("pw"), ...) 

jsonまたはyamlファイル


json形式は、主にWebサービスを介した対話に使用されます。 したがって、ほとんどの現代言語はjsonファイルを簡単に解釈します。 同じことがyamlファイルにも当てはまります。 Pythonのような他の言語が理解できる形式でパラメーターを保存したい場合、jsonは良い解決策かもしれません。
 # keys.json { "id":["my login name"], "pw":["my password"] } # script.R library(jsonlite) call_service(id = fromJSON("keys.json")$id, pw = fromJSON("keys.json")$pw, ...) 

Rからアクセスしている安全な金庫


これまでのすべてのアプローチの大きな欠点の1つは、すべての場合において、パラメーターが暗号化されていない形式でディスクのどこかに保存されることです。 おそらく、 キーチェーンLastPassのようなツールを使用しているのでしょう。

暗号化されたドライブをストレージに使用できます。 マウントされると、その内容はプレーンテキストのように処理できます。 つまり ユーザーRの観点から見ると、秘密データは単に暗号化されたドライブのどこかに「プレーンテキスト」として保存されます。

ダイジェストパッケージを使用する


別の代替方法は、Dirk Eddelbuettelでサポートされているダイジェストパッケージを使用することです。 Stefan Doyenはこのソリューションを提案しました。
  1. AES暗号化でダイジェストパッケージを使用します。
  2. 私は2つの機能を使用します。1つはAESで暗号化されたファイルを書き込み、2つ目はこれらのファイルを読み取り、復号化します。 これらの関数はgithubにあります。
  3. 次に、ダイジェストパッケージを使用して、ファイルを復号化および暗号化するキーを生成します。
  4. すべて準備ができたら、ユーザー名とパスワードを使用してデータブロック(データフレーム)を作成します。
  5. write.aes()関数を使用して、暗号化されたファイルにパラメーターをローカルに書き込みます。
  6. read.aes()使用すると、パラメーターを復号化し、Rにインポートできます。

したがって、機密データは明示的にもコード内にも現れません。 これにより、別の場所(リモートサーバー、USBディスクなど)にパラメーターを保存する機会が追加されます。 また、このソリューションは毎回パスワードを必要としません。

Stefanは、このコードを提供して以下を説明します。
 source("crypt.R") load("key.RData") credentials <- data.frame(login = "foo", password = "bar", stringsAsFactors = FALSE) write.aes(df = credentials, filename = "credentials.txt",key = key) rm(credentials) credentials <- read.aes(filename = "credentials.txt",key = key) print(credentials) 

ナトリウムパッケージの使用


別のオプションは、Jeroen Omsが作成したナトリウムパッケージを使用することです。 sodiumパッケージは、 libsodium暗号化ライブラリのRラッパーです。

libsodiumのラッパー:パスワードの暗号化、復号化、署名、ハッシュ化などのための最新の使いやすいライブラリ ナトリウムは、Daniel Bernsteinの最新のDiffie-Hellman機能であるcurve25519を使用します。これは、NSAでDual EC DRBGの脆弱性が発見された後に非常に人気がありました。

これは、Rから直接非対称キーを使用するなど、安全な通信を確立するためにナトリウムを使用できることを意味します。ナトリウムを使用してデータを暗号化するには、ダイジェストに上記のアプローチを使用します。

安全なパッケージを使用する


最後に、最後のオプションは、Headley Wickhamによって作成された安全なパッケージを使用することです。 パッケージの説明から:

安全なパッケージは、公的にアクセス可能なリポジトリに安全なストレージを提供します。 これにより、選択したユーザーのみが使用できるように、公開リポジトリに機密データを保存できます。 パッケージを使用すると、個人データを世界中に公開せずに公開リポジトリに保存できるため、これはテストに特に役立ちます。

セキュアは非対称暗号化に基づいています(公開鍵と秘密鍵を使用)。 Secureはランダムなマスターキーを生成し、それを使用してvault/各ファイルを暗号化(AES256)します。 メインキーは暗号化されていない形式ではどこにも保存されず、代わりに、各ユーザーのコピーが公開キーで暗号化されます。 各ユーザーは自分の秘密キーを使用してマスターキーを解読し、それを使用して各ファイルを解読できます。

これがどのように機能するかを理解するために、全体の研究が必要な場合があります。 しかし、一般的に、アイデアはこれです:

Headleyは、彼のgithubリポジトリでパッケージを使用するための段階的な手順を提供します

Source: https://habr.com/ru/post/J275757/


All Articles