加密,解密而无需硬密码

问题描述

| 我试图找到一种无需加密密码就可以在程序中加密和解密文件的技术,而无需向用户询问密码。 如果我还可以从另一个我正在编写的程序中解密文件,那就太好了。 到目前为止,我还没有运气找到一种足够安全的技术来满足我的喜好。 我正在用C#编写代码,但是语言并不重要,我只需要有人向我指出算法/技术的正确方向。     

解决方法

        这是一个反复出现的问题,没有安全的实际解决方案。如果您希望能够安全地加密/解密某些内容,则需要一个密钥。您的程序需要知道该密钥。如果存储了密钥,则其他人可以找到它并使用它来访问您的加密数据。 可以这样认为:如果您的程序应该能够访问加密的数据而无需将密钥硬编码到程序中,也无需询问用户密钥,那么为什么其他任何程序都不能这样做并获取加密的数据呢?数据?     ,        我认为在准备讨论如何编写代码之前,您需要进一步定义问题。 具体来说,谁应该能够解密数据?以及您将使用什么技术来阻止他人这样做。 就目前的情况而言,问题很可能是“我想要一把不需要钥匙的门锁。”声明并没有真正明确地定义目标。     ,        将带有密码的Web资源放在上面,并让代码请求该Web资源。当然,安全地进行此操作涉及SSL和Webhost,但它满足您的需求。     ,        如果您的程序使用自己的密码来设置用户帐户,则可以执行以下操作: 设置一个用户表,该表包含一列,用于存储程序范围密码的加密副本。 使用用户的密码作为密钥,对每个用户帐户中的程序范围密码的副本进行加密。 用户登录后,系统密码将使用其密码解密,并作为会话长度cookie(仅SSL)存储在其浏览器中。 这样,每个用户都可以在后台静默获取系统密码的副本。 但是,这种方法有一些严重的缺点。 首先,系统密码变得比WEAKEST用户密码更安全。如果来自Accounting的Bob将其密码设置为\“ password123 \”,则可用于检索系统密码的副本。 其次,细心的攻击者会注意到cookie包含系统密码,然后您就被搞砸了。 通过将解密的密码实际存储在通过SSL访问的第三台计算机上,然后根据用户的会话ID为每个事务检索该密码,可以避免这种情况。但这意味着如果第三台服务器由于任何原因关闭,则整个系统都将关闭。这还会造成性能损失,并且数据服务器的安全性将取决于密码服务器的安全性。 经过所有这些卷积之后,最终没有一个真正好的解决方案。您只需要提示他们输入密码或将其存储在服务器本身上,然后将服务器尽可能锁定即可。     ,        在密码术中,加密方案的强度是保密性和密钥强度的函数。这意味着密钥必须是秘密的(即攻击者无法访问)。现在,如果没有钥匙不在用户手中,也没有在应用程序代码中,那它在哪里?到底有多秘密? 因此,您需要重新考虑您的任务。对密钥的良好混淆可能会驱走大多数技能不高的攻击者。混淆密钥的最简单方法是使用程序的某些文本短语作为密钥。这使得对于偶尔潜伏者的密钥操作变得不那么明显(专业人士知道在应用程序中找到加密密钥的不同方法)。     ,        最好的答案可能是通过某种方式生成的密码(例如文件的大小或系统中的任何其他固定值)。因此,您在代码中存储获取密码的方式,而不是密码本身。