C# 记得我吗

C# 记得我吗,c#,winforms,security,hash,salt,C#,Winforms,Security,Hash,Salt,我有一个winform应用程序,它具有用户登录表单。我使用3个参数将用户登录信息存储在数据库中:用户名、哈希密码、salt: salt = random string that will be stored in database for every user hashed password = MD5(MD5(inputPassword) + MD5(salt)) 我希望在我的登录表单中有一个名为记住我的复选框,当用户输入正确的信息并选中它时,下次用户打开程序时,他们的用户信息将自动输入,用

我有一个
winform
应用程序,它具有用户登录表单。我使用3个参数将用户登录信息存储在数据库中:用户名、哈希密码、salt:

salt = random string that will be stored in database for every user
hashed password = MD5(MD5(inputPassword) + MD5(salt))
我希望在我的登录表单中有一个名为
记住我
的复选框,当用户输入正确的信息并选中它时,下次用户打开程序时,他们的用户信息将自动输入,用户只需单击
登录
按钮

我不能直接保存输入的密码,下次用它填充密码
textBox
,因为我知道一些软件可以像这样读取
textBox
,而且不安全

问题:

  • 我如何在不保存用户密码的情况下做到这一点

  • 如果我需要保存一些信息,如何加密它们

  • 有必要更改我的安全策略吗


  • 请注意,这是为客户端创建的客户端/服务器应用程序和登录表单。

    您可以在本地数据库中保存密码的哈希值,并且可以有一个隐藏的复选框,这表明您已经从已经散列的数据库中填充了信息,在请求身份验证时,您不需要再次散列密码值


    编辑如果用户试图手动输入密码,则您可以清除文本框值并更改复选框的选中值,以便您现在知道该值不是散列值。

    根据我的理解,如果您想拥有
    记住我
    功能,那么您应该/必须以任何形式存储密码以验证用户身份

    一种方法是,在您的产品中有两个功能。一个是有一个
    散列
    ,这将在数据库中,我认为您目前正在这样做。除此之外,还具有其他功能。选中
    记住我
    后,只需将加密值保存在
    app.config
    文件中即可。现在,当用户再次打开应用程序时,检查加密密码并解密以验证用户身份

    用户
    dbw
    刚刚发布了我的另一种方法:)


    希望能有帮助。

    哦,这是办不到的。如果您正在加密/散列/盐析并将密码保存在DB中,那么您就无法以纯文本形式将其恢复

    当然,您可以欺骗用户(我将告诉您如何),但需要定义您希望用户做什么:

    • 即使在用户要求“记住我”之后,也至少再次输入密码(每次)。这很容易做到,只需检索用户id并将密码框保留为空即可。不要耍花招。简单明了。甚至谷歌也为他们的网站这么做
    • 现在是时候了。允许用户输入应用程序而不使用密码,而只使用用户名。您只需在密码框中输入一些默认值(用户会认为实际检索到了密码,但您会编程,以便在选择“记住我”选项时,您只需填写此信息)并让用户进入。但这不是一个好的选择,因为可能任何使用该系统的人都可以登录到您的应用程序。根据您的安全要求,您必须接听电话

    在windows上有此功能。DataProtector和ProtectedData类可用于基于机器信息加密二进制数据。您可以将加密的范围指定为基于用户或基于系统,这样做很方便

  • 如果您认为这样更好,则只能序列化登录令牌信息,而不能序列化用户凭据

  • 您只需对序列化信息进行加密,并将其存储到您想要的任何位置。当您想在启动时使用它时,对其进行解密和反序列化

  • 我想是的

  • 您可以在此处查看它们:


    您试图通过执行
    MD5(MD5(inputPassword)+MD5(salt)来保护用户密码,这是值得尊敬的。
    您应该使用。使用GPU和密码方法,现代系统每秒可以轻松尝试超过100000000个密码。对于
    Rfc2898DeriveBytes
    而言,使用适当大的
    ITTERIONCOUNT
    ,您可以轻松地将该数字降低到每秒100个密码。