我正在编写一个需要读取用户名和密码并存储它们的应用程序,以便程序可以在以后再次读取它们.将它存储在某些变量中听起来像是一个愚蠢的想法.
发现KDE 库,但它有太大的依赖性,而且我太新手程序员了解如何使用它.
存储密码的常用方法有哪些,以及如何解决我的问题?
这取决于你将如何处理这些信息.
如果您要使用名称和密码来访问某些外部服务(但是用户必须在下次运行程序时重新输入信息),那么将它们存储在某些变量中就可以了.将它们加密存储(至少存储密码加密)可能是明智的,这样它在核心转储或等效物中是不可见的.当需要密码时,您解密它,使用它,然后写入存储解密版本的位置(切换它).(注意:在此上下文中散列不合适;您需要能够看到密码,并且无法撤消散列.)您可以决定将信息存储在程序之外(在磁盘文件中),但它似乎没必要.请注意,二进制文件仍然包含加密密钥(和加密算法),并且加密数据比程序的平均内容更随机,因此真正隐藏加密密码实际上非常困难(根本不可能).但是,除了最坚决的攻击者之外,你可以让它变得足够困难.
如果要将用户名和密码存储为永久记录,以便可以验证同一用户以后是否正在访问该信息,则必须使用该程序外部的存储; 您将使用一个简单的数据库,如果您确保解决任何并发问题,它可能像纯文本文件一样简单.在这种情况下,您将使用一些盐来哈希密码,并且您将以给定用户名的方式存储用户名,盐和哈希密码,您可以轻松找到其他两个值.
Night Walker评论:
我使用该密码访问某些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
Run Code Online (Sandbox Code Playgroud)
这不太令人满意,因为即使您将固定密钥与用户名称相结合,也就是说,有人可以计算出该密钥是什么(以及加密技术)并对其进行逆向工程.(加密数据的保密性取决于密钥;当密钥可由程序确定时,它也可由确定的攻击者确定.到目前为止,最好依靠用户提供密钥(或密码或在运行时传递短语;然后应用程序不存储攻击者可以脱机使用的任何内容.