我必须从我的iphone应用程序向ASP服务器页面发送用户名和密码,我将使用http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html加密它们。在ASP页面上解密这些字符串的最佳方法是什么?我发现了一些例子,但由于加密将发生在两个完全不相关的方面,我认为我需要对双方的密钥进行硬编码,而且我找不到任何没有使用生成密钥的示例。
谢谢!
答案 0 :(得分:2)
是的,密钥管理是一个大问题。您必须在两侧都有密钥,在iOS上您可以将密钥保存在钥匙串中,这是安全的,但是安全地将密钥安全到位的过程更加困难。
另一个主要问题是双方的所有参数都相同。特别感兴趣的是
答案 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);
}
这使您可以在没有密码破解的情况下通过纯文本进行身份验证。