2009-09-27 58 views
5

我正在编写一个应用程序,需要读取用户名和密码并将它们存储起来,以便以后程序可以再次读取它们。将它存储在一些变量中听起来像一个愚蠢的想法。在应用程序内保存密码

发现KDE library,但它有太大的依赖性,我太新手程序员了解如何使用它。

什么是常见的存储密码的方法,以及我如何解决我的问题?

回答

7

这取决于你将如何处理这些信息。

如果您打算使用名称和密码来访问某些外部服务(但下次运行该程序时用户将不得不重新输入信息),则将它们存储在某些变量中即可。将它们加密存储(至少需要存储加密的密码)可能是明智的做法,以便在核心转储或等价物中不可见。当需要密码时,您解密它,使用它,然后在解密版本的存储位置(切换它)进行写入。 (注意:散列在这种情况下是不合适的;您需要能够看到密码,并且不能撤消散列。)您可以决定将信息存储在程序之外(在磁盘文件中),但它似乎没有必要。请注意,二进制文件仍然包含加密密钥(和加密算法),并且加密数据比程序的平均内容更随机,因此真正隐藏加密密码实际上非常困难(不可能接近)。但是,你可以让它变得很难,它会阻止除最坚决的攻击者之外的所有攻击者。

如果您打算将用户名和密码存储为永久记录,以便您可以验证同一用户将来访问该信息,那么您必须使用该程序外部的存储;您将使用简单的数据库,如果您确保解决任何并发问题,则该数据库可能与纯文本文件一样简单。在这种情况下,您将使用一些salt对密码进行哈希处理,您将以给定用户名的方式存储用户名,salt和散列密码,您可以轻松找到其他两个值。


夜沃克评论:

我使用该密码访问某些网站数据库,所以我需要它存储在我的应用程序是为进入后的第一次。你确定一个纯文本文件是一个聪明的想法吗?

这取决于你如何构想'存储在我的应用程序'。你不能修改可执行文件,或者至少不应该这样做。所以,你需要将它看作是存储在与应用程序可执行文件分开的某种文件中的永久记录。另一方面,您确实遇到了与我所概述的不同的问题 - 您没有使用信息验证用户身份;您需要解密信息按需发送到其他应用程序。

首先,这意味着盐和散列不相关;您需要反转屏蔽操作,并且不能反转散列。

接下来,您需要决定如何在再次出现时识别应用程序的用户。用户是否有义务输入一些密码来获取他们自己的数据,或者您是否仅仅依赖操作系统权限或其他方案。

如果用户必须在应用程序中输入一些密码才能开始使用,那么您可以考虑使用该密码(或其散列,与用于识别应用程序密码的密码散列不同)来加密用户名/外部应用程序的密码组合。然后,您可以将用户名和出于参数的原因,将加密密码的Base-64编码版本存储到文本文件中;这与应用程序密码一样安全,它以原始的盐渍散列格式存储。当用户返回时,他们必须提供他们的应用程序用户名和密码,并且可以根据存储的值验证该组合,然后使用密码将密码解密到外部应用程序。

如果用户没有输入密码,那么您在做什么时会受到更多的限制。您必须能够根据您可用的信息以某种方式确定密钥,这些信息可用于将用户的加密密码存储在受限位置(例如其主目录下的子目录中的一个文件中)中,该组无法进行组或公共访问:

mkdir ~/.appname 
chmod 700 ~/.appname 
cp /dev/null ~/.appname/app.key 
...store the encrypted information... 
chmod 500 ~/.appname 
chmod 400 ~/.appname/app.key 

这是不太令人满意的,因为即使你把用户的名字固定密钥,比方说,有机会,有人能制定出关键是什么(加密技术)和反向工程了。 (加密数据的保密性取决于密钥;当密钥可由程序确定时,它也可由确定的攻击者确定。最好依靠用户提供密钥(或密码或在运行时密码短语);然后在应用程序不存储任何攻击者可以利用离线

+0

我使用该密码访问某些Web数据库,所以我需要它在第一次输入后存储在我的应用程序中。 你确定纯文本文件是这个聪明的想法吗? – 2009-09-27 21:15:51

+0

所以我认为它永久记录是迄今为止最好的想法。 该应用程序没有任何其他密码,并且不测量其他用户将使用该应用程序。 唯一的办法就是尝试保存其他人员的密码+用户名。 – 2009-09-27 22:33:26

+0

是的,将信息存储在某个永久文件中将是必要的。为应用程序的每个用户使用一个单独的文件;以Base-64编码存储加密的密码(所以你有一个纯文本文件)。从你认为是用户最可靠的特征(可能是他们的用户名和用户ID号的连接,也可能是一些固定的文本)的密码散列中推导用于加密的密钥,并将其存储为安全你可以设计一个位置。安全性不够完美 - 你可以设计出你的攻击者可以发现的东西。 – 2009-09-27 22:43:48

0

是什么样的应用程序呢?有许多方法,但如果它的ASP.Net通常在web.config文件中进行加密。

+0

它是跨平台的c + +应用程序(不是一些网络小程序) – 2009-09-27 20:54:07

5

通常您会存储密码的用户名和散列版本。看到这篇维基百科文章:hash functions,和这question

+2

如果您以后需要使用实际的密码登录到远程系统或类似的东西,密码的哈希将无法帮助。 – 2009-09-27 21:32:47

+0

绝对..... – Peter 2009-09-28 02:35:14

1

什么MySQL或SQLite的散列密码,并将它们存储在持久性的数据库,没有

1

常见。?存储密码以供将来使用的方法是将它们存储在某些加密缓存中,该缓存使用一些主密码加密,每次需要缓存密码时都应输入主密码KeePassX是一个小型的开源应用程序,它使用主密码存储个人数据(用户名称,p密码等)。它有一个轻便的界面,是跨平台的,并根据GNU通用公共许可证的条款发布。你可以检查它作为样本,并使用它的一些部分。

0

在spotep.com我们只存储用户名和用户名和密码组合的哈希码。这样做的好处是similair(通常微不足道的)密码不会导致相同的哈希码(存储在cookie中,因此非常不安全)。

+0

不错的网站,但你错过了很多系列 迦太基,太空堡垒卡拉狄加,无政府状态的儿子等...... – 2009-09-27 23:38:44

+0

嗯,不,我们不? – 2009-12-23 09:22:49

1

我建议在SQLite中存储散列密码。然后,无论何时您需要检查密码,将其加以散列,然后将其与存储的值进行比较。这使得存储的密码保持安全,所以没有人(甚至你)不知道它们是什么。

1

您可以尝试QSettings,它提供了持久的平台无关的应用程序设置。像mysql这样的解决方案会过度杀伤,除非你有数百个密码来存储。