【问题标题】:AES256 encryption and decryption in ASPASP中的AES256加解密
【发布时间】:2011-10-05 15:34:32
【问题描述】:

我必须将用户名和密码从我的 iphone 应用程序发送到 ASP 服务器页面,然后我将使用:http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html 对其进行加密。在 ASP 页面上解密这些字符串的最佳方法是什么?我找到了一些示例,但是由于加密将发生在两个完全不相关的方面,我认为我需要在双方都对密钥进行硬编码,并且我找不到任何没有使用生成密钥的示例。

谢谢!

【问题讨论】:

    标签: asp.net ios encryption key


    【解决方案1】:

    是的,密钥管理是个大问题。您必须在两边都有密钥,在 iOS 上,您可以将密钥保存在 Keychain 中,这是安全的,但安全获取密钥的过程更加困难。

    另一个主要问题是让两边的所有参数都相同。特别感兴趣的是

    1. 加密密钥值和大小
    2. 模式:CBC、ECB 等(您可能应该使用 CBC)
    3. 大多数模式都需要初始化向量 (iv)
    4. 填充方法:PKCS7等(AES是块密码,需要输入 块大小的倍数)

    【讨论】:

    • 谢谢 - 您对如何处理这些问题有什么建议吗?
    • 一开始选择了简单的测试数据,让它发挥作用并进入更复杂的情况。例如:最初选择一个全为 0 的 iv,CBC,数据正好是一个块大小,没有填充。当它起作用时,开始增加更多的复杂性。无论如何,如果您想要真正的安全性,请让经验丰富的专业人员进行代码审查,我愿意。安全并不容易,加密部分是容易的部分。或使用 SSL。哦,如果他们有帮助,请接受答案。
    【解决方案2】:

    为什么不使用 SHA1 将密码存储在数据库中,然后使用 HMAC 和客户端指定的密钥进行通信?

    让服务器生成一个随机密钥并将其与登录请求一起发送。客户端计算密码的 SHA1 哈希,然后使用服务器指定的密钥计算密码的 HMAC SHA1 哈希。然后服务器验证结果是否正确。

    在客户端:

    // password is the plaintext password
    // keyb64 is a random key specified by the server, encoded in base64.
    string ComputeSecureHash(string password, string keyb64)
    {
        byte[] data = Encoding.UTF8.GetBytes(password);
        byte[] key = Convert.FromBase64String(keyb64);
        byte[] hash;
        byte[] machash;
        // compute a plain SHA1 hash of the specified data
        using (SHA1Managed sha1 = new SHA1Managed())
        {
            hash = sha1.ComputeHash(data);
        }
        // now compute a HMAC hash of that hash, using the random key.
        using (HMACSHA1 sha1mac = new HMACSHA1(key))
        {
            machash = sha1mac.ComputeHash(hash);
        }
        return Convert.ToBase64String(machash);
    }
    

    在服务器端:

    // hash is the string produced by the function above
    // realHash is the SHA1 hash of the real password, which you've fetched from the db
    // key is the key you generated for this login session
    bool VerifyHash(string hash, byte[] realHash, byte[] key)
    {
        byte[] machash;
        using (HMACSHA1 sha1mac = new HMACSHA1(key))
        {
            machash = sha1mac.ComputeHash(realHash);
        }
        return (Convert.ToBase64String(machash) == hash);
    }
    

    这允许您通过纯文本媒体进行身份验证,而无需破解密码。

    【讨论】:

    • 推出自己的计划往往会以眼泪收场。大多数开发人员最好坚持使用 TLS / SSL 等久经考验的真实技术。
    • 这不是“我自己的方案”,它是一种众所周知的 MAC 身份验证形式。
    • 我意识到这一点,但它正在验证客户端,而不是服务器。例如,该方案不会阻止 MITM。像 TLS 这样的技术可以,因此是较早的建议。
    • 如何不阻止 MITM?这是一个服务器选择的密钥,可以防止重放攻击。您也无法解密密码。当然,您可以在经过身份验证后去攻击会话,但这不是问题要求阻止的。
    猜你喜欢
    • 2012-04-09
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多