ASP中的AES256加密和解密

时间:2011-10-05 15:34:32

标签: asp.net ios encryption key

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

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,密钥管理是一个大问题。您必须在两侧都有密钥,在iOS上您可以将密钥保存在钥匙串中,这是安全的,但是安全地将密钥安全到位的过程更加困难。

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

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

答案 1 :(得分:0)

为什么不用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);
}

这使您可以在没有密码破解的情况下通过纯文本进行身份验证。