缓存API密钥以便在C#项目中广泛使用

缓存API密钥以便在C#项目中广泛使用,c#,asp.net,.net,caching,console-application,C#,Asp.net,.net,Caching,Console Application,我需要在整个项目(控制台应用程序)中多次使用API密钥。基本上我想这样做: 从本地数据库获取API密钥和少量其他可重用值 将它们缓存到某个地方,在那里我可以使用它们,而无需再次访问数据库 也像这样缓存,安全吗?在离开应用程序之前是否可以完全清除缓存? 谢谢。关于该主题的完整文档。关于该主题的完整文档。您可能希望将其存储在静态变量中。为了更安全,请使用class您可能希望将其存储在静态变量中。为了更安全,可以使用类或者使用依赖项注入来传递信息。 但是你真的需要它在你的应用程序中吗?这可能是设计

我需要在整个项目(控制台应用程序)中多次使用API密钥。基本上我想这样做:

  • 从本地数据库获取API密钥和少量其他可重用值
  • 将它们缓存到某个地方,在那里我可以使用它们,而无需再次访问数据库
也像这样缓存,安全吗?在离开应用程序之前是否可以完全清除缓存?
谢谢。

关于该主题的完整文档。

关于该主题的完整文档。

您可能希望将其存储在静态变量中。为了更安全,请使用class

您可能希望将其存储在静态变量中。为了更安全,可以使用类

或者使用依赖项注入来传递信息。
但是你真的需要它在你的应用程序中吗?这可能是设计不好的迹象。

也许可以使用依赖注入来传递东西。
但是你真的需要它在你的应用程序中吗?这可能是设计不好的迹象。

安全吗?视情况而定。您的流程是否正常

(In)安全性完全取决于是否可能(或不可能)访问您的进程。如果有人可以访问您的进程,他们就可以读取密钥,不管您是静态存储它(尽管这会使事情变得更容易),还是您只是获取它并将其保存在内存中(在堆栈上)最短的时间

您的应用程序总是有可能被分页到磁盘,将其内存内容(可能包括密钥)写入页面文件(磁盘)。即使您的密钥仅用于当前请求,也可能发生这种情况(如果进程在错误的时间被调出!)

像其他人建议的那样,使用SecureString之类的类是最好的选择;当然,在一台不受损害且安全的机器上运行您的进程

如果您需要在用户具有管理权限的任意计算机上运行它,那么没有任何东西可以真正阻止用户读取密钥。 在这种情况下,最薄弱的环节可能是本地数据库(用户可以直接从数据库中读取密钥)

但是,即使在这种情况下,使用SecureString也是一个好主意:它的内容是加密的,并进一步增强了保护(使攻击者更难从进程中读取其纯文本内容)


但是,您还需要保护您的数据库以及您的数据库凭证(这些凭证可能在您的应用程序中硬编码,如果用户/攻击者再次访问计算机和您的应用程序,可以轻松读取)。

是否安全?视情况而定。您的流程是否正常

(In)安全性完全取决于是否可能(或不可能)访问您的进程。如果有人可以访问您的进程,他们就可以读取密钥,不管您是静态存储它(尽管这会使事情变得更容易),还是您只是获取它并将其保存在内存中(在堆栈上)最短的时间

您的应用程序总是有可能被分页到磁盘,将其内存内容(可能包括密钥)写入页面文件(磁盘)。即使您的密钥仅用于当前请求,也可能发生这种情况(如果进程在错误的时间被调出!)

像其他人建议的那样,使用SecureString之类的类是最好的选择;当然,在一台不受损害且安全的机器上运行您的进程

如果您需要在用户具有管理权限的任意计算机上运行它,那么没有任何东西可以真正阻止用户读取密钥。 在这种情况下,最薄弱的环节可能是本地数据库(用户可以直接从数据库中读取密钥)

但是,即使在这种情况下,使用SecureString也是一个好主意:它的内容是加密的,并进一步增强了保护(使攻击者更难从进程中读取其纯文本内容)


但是,您还需要保护您的DB和DB凭据(可能是应用程序中的硬编码,如果用户/攻击者再次访问计算机和应用程序,则可以轻松读取这些凭据)。

通常,您不需要专用的缓存类来存储应用程序中的一两个值。一个静态字段或单个对象实例上的一个字段就足够了。通常,在应用程序中存储一两个值不需要专用的缓存类。一个静态字段或一个单例对象实例上的字段就足够了。1)我了解您想要实现什么,实现它的具体问题是什么?请具体说明。2) 有一定程度的安全性,在不了解上下文的情况下很难回答这个问题。例如,对于托管在安全数据中心并处理不太敏感数据的web服务器应用程序,这可能非常合适。如果它是客户端应用程序,它的安全性永远不足以防止秘密被提取。1)我理解你想要实现什么,你在实现它时的具体问题是什么?请具体说明。2) 有一定程度的安全性,在不了解上下文的情况下很难回答这个问题。例如,对于托管在安全数据中心并处理不太敏感数据的web服务器应用程序,这可能非常合适。如果它是客户端应用程序,它的安全性永远都不足以阻止秘密被提取。你能告诉我为什么它是糟糕设计的标志吗。这是一个API密钥,我需要在各种类文件中多次访问它。它暗示违反了封装。如果您在应用程序中的每个位置都需要一个资源,那么您的应用程序并没有很好地封装该资源所需的作业。这也会使重构变得更加困难。你能告诉我,像API Key(来自DB)这样的东西如何在多个类中都可用,每个类都有一个独立的功能吗?我想说的是,你的应用程序应该只与你正在使用的API有一个“接触点”