如何使用 WS-UsernameToken 获取结果摘要?
How to get Resulting Disgest with WS-UsernameToken?
的以下文档
我目前正在尝试使用指南中给出的相同条目重现 结果摘要...
这是我的代码:
private string GenerateHashedPassword(string nonce, string created, string password)
{
byte[] nonceBytes = Encoding.UTF8.GetBytes(nonce);
byte[] createdBytes = Encoding.UTF8.GetBytes(created);
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] combined = new byte[createdBytes.Length + nonce.Length + passwordBytes.Length];
//N-C-P
Buffer.BlockCopy(nonceBytes, 0, combined, 0, nonceBytes.Length);
Buffer.BlockCopy(createdBytes, 0, combined, nonceBytes.Length, createdBytes.Length);
Buffer.BlockCopy(passwordBytes, 0, combined, nonceBytes.Length + createdBytes.Length, passwordBytes.Length);
return Convert.ToBase64String(SHA1.Create().ComputeHash(combined));
}
当我使用我的功能时:
string digestPassword = GenerateHashedPassword("LKqI6G/AikKCQrN0zqZFlg==","2010-09-16T07:50:45Z","userpassword");//Values from guide
我的函数 return 与指南中的结果不一样...
我的函数有什么问题??
为什么我不能得到相同的输出??
伪代码中的正确步骤是
1. n = base64decode ("LKqI6G/AikKCQrN0zqZFlg==")
2. s = sha1 (n + "2010-09-16T07:50:45Zuserpassword")
3. resulting_digest = base64encoder (s)
作为参考,中间值为:
1. n = '\x2c\xaa\x88\xe8\x6f\xc0\x8a\x42\x82\x42\xb3\x74\xce\xa6\x45\x96'
2. s = '\xb6\xe3\x92\xa4\x69\x45\x94\x85\xec\xa3\x3a\xb8\x1c\x53\x5e\x78x\x85\x2c\x42'
你没有 post 你得到的结果,但我认为你在用 sha1 散列的二进制字符串中使用了 base64 编码版本的随机数。
多亏了@Ottavio 的帮助,我发现我在将 nonce 与我的其余条目进行哈希处理之前没有对其进行解码......我用来获得良好结果的代码是:
private string GenerateHashedPassword(string nonce, string created, string password)
{
byte[] nonceBytes = Convert.FromBase64String(nonce);
byte[] createdAndPasswordBytes = Encoding.UTF8.GetBytes(created + password);
byte[] combined = new byte[nonceBytes.Length + createdAndPasswordBytes.Length];
Buffer.BlockCopy(nonceBytes, 0, combined, 0, nonceBytes.Length);
Buffer.BlockCopy(createdAndPasswordBytes, 0, combined, nonceBytes.Length, createdAndPasswordBytes.Length);
return Convert.ToBase64String(SHA1.Create().ComputeHash(combined));
}
我目前正在尝试使用指南中给出的相同条目重现 结果摘要...
这是我的代码:
private string GenerateHashedPassword(string nonce, string created, string password)
{
byte[] nonceBytes = Encoding.UTF8.GetBytes(nonce);
byte[] createdBytes = Encoding.UTF8.GetBytes(created);
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] combined = new byte[createdBytes.Length + nonce.Length + passwordBytes.Length];
//N-C-P
Buffer.BlockCopy(nonceBytes, 0, combined, 0, nonceBytes.Length);
Buffer.BlockCopy(createdBytes, 0, combined, nonceBytes.Length, createdBytes.Length);
Buffer.BlockCopy(passwordBytes, 0, combined, nonceBytes.Length + createdBytes.Length, passwordBytes.Length);
return Convert.ToBase64String(SHA1.Create().ComputeHash(combined));
}
当我使用我的功能时:
string digestPassword = GenerateHashedPassword("LKqI6G/AikKCQrN0zqZFlg==","2010-09-16T07:50:45Z","userpassword");//Values from guide
我的函数 return 与指南中的结果不一样...
我的函数有什么问题?? 为什么我不能得到相同的输出??
伪代码中的正确步骤是
1. n = base64decode ("LKqI6G/AikKCQrN0zqZFlg==")
2. s = sha1 (n + "2010-09-16T07:50:45Zuserpassword")
3. resulting_digest = base64encoder (s)
作为参考,中间值为:
1. n = '\x2c\xaa\x88\xe8\x6f\xc0\x8a\x42\x82\x42\xb3\x74\xce\xa6\x45\x96'
2. s = '\xb6\xe3\x92\xa4\x69\x45\x94\x85\xec\xa3\x3a\xb8\x1c\x53\x5e\x78x\x85\x2c\x42'
你没有 post 你得到的结果,但我认为你在用 sha1 散列的二进制字符串中使用了 base64 编码版本的随机数。
多亏了@Ottavio 的帮助,我发现我在将 nonce 与我的其余条目进行哈希处理之前没有对其进行解码......我用来获得良好结果的代码是:
private string GenerateHashedPassword(string nonce, string created, string password)
{
byte[] nonceBytes = Convert.FromBase64String(nonce);
byte[] createdAndPasswordBytes = Encoding.UTF8.GetBytes(created + password);
byte[] combined = new byte[nonceBytes.Length + createdAndPasswordBytes.Length];
Buffer.BlockCopy(nonceBytes, 0, combined, 0, nonceBytes.Length);
Buffer.BlockCopy(createdAndPasswordBytes, 0, combined, nonceBytes.Length, createdAndPasswordBytes.Length);
return Convert.ToBase64String(SHA1.Create().ComputeHash(combined));
}