在我目前的一个项目中,我使用的是单用户认证系统。我说“单用户”,因为我没有计划在同一个Windows帐户上为多个用户开展这项工作(仅仅因为它不是我想要做的事)。字符串加密问题
当用户启动应用程序时,它们会显示一个验证屏幕。此认证屏幕使用图像(即点击图像中的3个特定点),用户名(标准编辑框)和图像选项(允许用户选择要使用的图像的下拉菜单)。图像选择,用户名和点击图像上的点数必须与用户在设置密码时指定的值相匹配。
将所有3个结果合并为一个字符串,然后使用Soap.EncdDecd.EncodeString
方法对其进行编码。然后使用SHA-512对其进行散列。最后,它使用DES加密。然后将此值与设置密码时创建的值进行比较。如果匹配,他们被授予访问权限。如果不是,访问被拒绝。我打算在应用程序的其他位置使用SHA512值(例如在主应用程序中使用“主密码”来授权自己使用各种不同的模块)。
在一个示例中,初始字符串的长度为29个字符,SOAP编码的字符串约为40个字符,SHA-512字符串为128个字符,DES值为344个字符。由于我没有使用大量的字符串,它实际上非常快。 SOAP被用作非常基本的混淆而不是安全措施。
我担心的是,第一部分(纯字符串和SOAP)可能是弱点。基本的字符串不会给他们一些他们可以输入并被授予访问权限的东西,但是它会给他们“图像点击坐标”以及用户名和图片选项,这可能允许他们访问应用程序。 SOAP字符串可以很容易解码。
什么是加强验证的第一部分以尝试避免值直接从内存中扯下来的最佳方法?我是否应该关心潜在的利用者或攻击者如何读取这些值?
作为与此相同主题直接相关的另一个问题;
什么是最好的方式来存储用户在初始设置过程中创建的密码散列?
我目前有TIniFile.SectionExists
方法运行,因为我已经没有抽时间去想出一些更优雅。这是我缺乏知识的一个领域。我需要在会话中存储密码“hash”(所以使用内存流不是一种选择),但是我需要确保安全性足够好,以至于不能被任何脚本kiddie彻底破解。
它真的更关心我是否应该关心,以及我所做的编码,哈希和加密是否足够。我开发的图片密码系统已经是一个很好的基础来阻止传统的“我知道你的基于文本的密码是什么现在我在你的系统中”攻击,但我关心的是更多的技术攻击从记忆里。
你的用户会恨你,你的程序仍然会被黑客入侵。两个世界中最糟糕的。 –