2011-10-05 81 views
1

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

谢谢!

回答

2

是的,密钥管理是一个大问题。您必须在双方都拥有密钥,在iOS上,您可以将密钥保存在密钥链中,这是安全的,但要安全地将密钥安全存放的过程更加困难。

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

  1. 加密密钥值和大小
  2. 模式:CBC,ECB等。(你或许应该使用CBC)
  3. 初始化向量(IV),需要对大多数的模式
  4. 填补方法:PKCS7等(AES是块暗号,需要输入在 块大小的倍数)
+0

谢谢 - 你有什么建议如何处理这些问题? – Aaron

+0

首先选择简单的测试数据,开始工作并进入更复杂的情况。例如:最初选择全部为0的数据,CBC,只有一个块大小的数据,没有填充。在工作的时候开始增加复杂度。无论如何,如果你想要真正的安全性,你需要由经验丰富的专业人员进行代码审查,我确实需要。 安全性不容易,加密部分是容易的部分。 或使用SSL。哦,如果他们有帮助,接受答案。 – zaph

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); 
} 

这可以让你无需破解密码认证通过明文媒体。

+1

滚动你自己的计划往往会以眼泪结束。大多数开发人员最好坚持使用TLS/SSL等久经考验的技术。 – Levi

+0

这不是“我自己的方案”,它是一种众所周知的MAC认证形式。 – Polynomial

+1

我意识到,但它是验证客户端,而不是服务器。例如,该方案不妨碍MITM。像TLS这样的技术,因此是早期的建议。 – Levi