我正在编写一个需要读取用户名和密码并存储它们的应用程序,以便程序可以在以后再次读取它们。将它存储在某些变量中听起来像是一个愚蠢的想法。
发现KDE library,但它有太大的依赖性,而且我太新手程序员了解如何使用它。
存储密码的常用方法有哪些,以及如何解决我的问题?
答案 0 :(得分:9)
这取决于您将如何处理这些信息。
如果您要使用名称和密码来访问某些外部服务(但是用户必须在下次运行程序时重新输入信息),那么将它们存储在某些变量中就可以了。将它们加密存储(至少存储密码加密)可能是明智的,这样它在核心转储或等效物中是不可见的。当需要密码时,您解密它,使用它,然后写入存储解密版本的位置(切换它)。 (注意:在此上下文中散列不合适;您需要能够看到密码,并且无法撤消散列。)您可以决定将信息存储在程序之外(在磁盘文件中),但它似乎没必要。请注意,二进制文件仍然包含加密密钥(和加密算法),并且加密数据比程序的平均内容更随机,因此真正隐藏加密密码实际上非常困难(根本不可能)。但是,除了最坚决的攻击者之外,你可以让它变得足够困难。
如果您要将用户名和密码存储为永久记录,以便以后可以验证同一用户是否正在访问该信息,那么您必须使用该程序外部的存储;您将使用一个简单的数据库,如果您确保解决任何并发问题,它可能像纯文本文件一样简单。在这种情况下,您将使用一些盐来对密码进行哈希处理,并且您将以这样的方式存储用户名,盐和哈希密码,在给定用户名的情况下,您可以轻松找到其他两个值。
我使用该密码访问某些Web数据库,所以我需要在第一次输入后将其存储在我的应用程序中。你确定一个纯文本文件是一个聪明的想法吗?
这取决于你如何构思“存储在我的应用程序中”。您无法修改可执行文件,或者至少不应该尝试这样做。因此,您需要将其视为存储在与应用程序可执行文件分开的某种文件中的永久记录。另一方面,您确实面临与我概述的不同的问题 - 您没有使用该信息对用户进行身份验证;您需要按需解密信息以发送到其他应用程序。
首先,这意味着盐和哈希不相关;你需要反转掩码操作,你不能反转哈希。
接下来,您需要决定在重新出现时如何识别应用程序的用户。用户是否有义务输入一些密码来获取自己的数据,或者您只需依赖操作系统权限或其他方案。
如果用户必须在您的应用程序中输入一些密码才能开始使用,那么您可以考虑使用该密码(或其密码,不同于用于识别应用程序密码的密码哈希)来加密用户名/外部应用程序的密码组合。然后,您可以存储用户名,并且为了参数,将加密密码的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
这不太令人满意,因为即使您将固定密钥与用户名相结合,也就是说,有人可以找出该密钥是什么(以及加密技术)并对其进行逆向工程。 (加密数据的保密性取决于密钥;当密钥可由程序确定时,它也可由确定的攻击者确定。到目前为止,最好依靠用户提供密钥(或密码或在运行时传递短语;然后应用程序不存储攻击者可以离线使用的任何内容。
答案 1 :(得分:5)
通常存储用户名和密码的哈希版本。请参阅此维基百科文章:hash functions和此question。
答案 2 :(得分:1)
MySQL或SQLite怎么样?散列密码并将其存储在持久数据库中,不是吗?
答案 3 :(得分:1)
存储密码以供以后使用的常用方法是将它们存储在某些加密缓存中。该缓存使用一些主密码加密。每次需要缓存密码时,用户都应输入主密码。 KeePassX是一个小型开源应用程序,它使用主密码存储个人数据(用户名,密码等)。它具有轻量级界面,是跨平台的,并根据GNU通用公共许可证的条款发布。您可以将其作为样本进行检查并使用它的某些部分。
答案 4 :(得分:1)
我建议在SQLite中存储哈希密码。然后,无论何时需要检查密码,请将其哈希,然后将其与存储的值进行比较。这样可以保证存储的密码安全,因此没有人(甚至不是你)知道它们是什么。
答案 5 :(得分:1)
您可以尝试QSettings,它提供与平台无关的持久应用程序设置。除非你有数百个密码要存储,否则像mysql这样的解决方案会有点过分。
答案 6 :(得分:0)
它是什么类型的应用程序?有很多方法,但如果它的ASP.Net在web.config文件中加密是常见的。
答案 7 :(得分:0)
在spotep.com,我们只存储用户名和用户名的哈希码以及密码。这样做的好处是,similair(通常是微不足道的)密码不会产生相同的哈希码(存储在cookie中,因此非常不安全)。