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