質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
WinUI3

WinUI3は、Windowsデスクトップアプリ開発向けのネイティブUIフレームワークのバージョン3です。Windows10以降で採用されたFluentデザインに対応。直観的で使いやすい機能を備えています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

ChatGPT

ChatGPTは、OpenAI社の提供するインタラクティブなテキストコミュニケーションを行うことができるAIサービスまたは、そのアルゴリズムのモデル名です。

Q&A

解決済

1回答

471閲覧

API Key の保存の方法

MomenToufu

総合スコア10

WinUI3

WinUI3は、Windowsデスクトップアプリ開発向けのネイティブUIフレームワークのバージョン3です。Windows10以降で採用されたFluentデザインに対応。直観的で使いやすい機能を備えています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

ChatGPT

ChatGPTは、OpenAI社の提供するインタラクティブなテキストコミュニケーションを行うことができるAIサービスまたは、そのアルゴリズムのモデル名です。

0グッド

0クリップ

投稿2023/08/02 01:45

質問

設定されたAPI key はどこにどの様に保存するのがセキュアなのでしょうか?また一般的なのでしょうか?

前提

具体的には次の通りです。

  • インストールするウインドウズアプリケーション(WPFやWinUIなど)であり、一部機能に関してAPIにて情報の授受を行う。
  • API キーはユーザーが取得し、アプリケーションの設定等の項目で入力する必要がある。
  • API キーは変更が無ければ、前回使用時の内容とする(どこかにAPIキーを保存しておく必要がある)。

※具体的にはChatGPTなどの様なAPIサービスを想定しています。

質問の詳細

設定されたAPI key はどこにどの様に保存するのがセキュアなのでしょうか?また一般的なのでしょうか?

Webサービスの場合については過去の質問で以下の様なものが見つかります。
https://teratail.com/questions/34281

例えば、この質問回答にある内容の「サーバー上の話」を、「ローカルPCの話」に置き換えて理解して問題ないのでしょうか。

すれば、アプリケーションの設定ファイルとかと同様に、C:\Users\[ユーザー名]\AppData\Local\ などに保存することになるかと思いますが、そのような認識でよいのでしょうか?(例えば以下の様な場所に保存しておく)

C:\Users\[ユーザー名]\AppData\Local\[アプリケーション名]\ │ ├ [設定ファイル] (Config.json Config.yaml などなど) ├ [ログファイル] │ … └ [APIキーが記載されたファイル] (平文?暗号化?)

以上です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Windows限定であれば資格情報を利用する手もあります。
具体的には資格情報の管理に記載のCredentials Management APIが利用できそうです。
以下はChatGPTが回答した、汎用資格情報(CRED_TYPE_GENERIC)に格納するサンプルコードです。動作は未確認です。

C++

1#include <Windows.h> 2#include <wincred.h> 3#include <string> 4#include <iostream> 5 6bool SaveOpenAIAPIKey(const std::wstring& username, const std::wstring& api_key) { 7 std::wstring target_name = L"OpenAI_API_Key"; 8 std::wstring user_name = username; 9 std::wstring cred_blob = api_key; 10 11 CREDENTIAL cred = {}; 12 cred.Type = CRED_TYPE_GENERIC; 13 cred.TargetName = const_cast<LPWSTR>(target_name.c_str()); 14 cred.UserName = const_cast<LPWSTR>(user_name.c_str()); 15 cred.CredentialBlobSize = static_cast<DWORD>(cred_blob.size() * sizeof(wchar_t)); 16 cred.CredentialBlob = reinterpret_cast<LPBYTE>(cred_blob.data()); 17 cred.Persist = CRED_PERSIST_LOCAL_MACHINE; // Change to CRED_PERSIST_SESSION if you want per-session storage 18 19 BOOL result = CredWrite(&cred, 0); 20 return (result != 0); 21} 22 23std::wstring GetOpenAIAPIKey(const std::wstring& username) { 24 std::wstring target_name = L"OpenAI_API_Key"; 25 std::wstring user_name = username; 26 27 PCREDENTIAL cred = nullptr; 28 BOOL result = CredRead(target_name.c_str(), CRED_TYPE_GENERIC, 0, &cred); 29 if (result) { 30 if (cred->UserName == user_name) { 31 std::wstring api_key(reinterpret_cast<wchar_t*>(cred->CredentialBlob), cred->CredentialBlobSize / sizeof(wchar_t)); 32 CredFree(cred); 33 return api_key; 34 } 35 CredFree(cred); 36 } 37 38 return L""; 39} 40 41int main() { 42 std::wstring username = L"YourUsername"; // ユーザー名を適切な値に置き換えてください 43 std::wstring openai_api_key = L"YourOpenAIAPIKey"; // OpenAIのAPIキーを適切な値に置き換えてください 44 45 // APIキーの保存 46 bool saved = SaveOpenAIAPIKey(username, openai_api_key); 47 if (saved) { 48 std::wcout << L"API key saved successfully." << std::endl; 49 } else { 50 std::wcout << L"Failed to save API key." << std::endl; 51 } 52 53 // APIキーの取得 54 std::wstring retrieved_api_key = GetOpenAIAPIKey(username); 55 if (!retrieved_api_key.empty()) { 56 std::wcout << L"Retrieved API Key: " << retrieved_api_key << std::endl; 57 } else { 58 std::wcout << L"API key not found." << std::endl; 59 } 60 61 return 0; 62}

投稿2023/08/02 04:26

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MomenToufu

2023/08/03 23:48

ご回答ありがとうございます。 あまり良くない質問だったかと思いますが、参考になります。 いろいろと試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問