正在尝试使用 SHA1 哈希将密码发送到 Google
Attempting to use SHA1 hashing to send password to Google
我目前正在使用 Google 的目录 API 开发一个程序来重置我域中某人的密码。我一切正常,但我想将加密密码发送到 Google 而不是明文。
由于 API 似乎限制了我可以用来加密的内容,我正在尝试使用 SHA-1 来加密。问题是,当我用 SHA-1 加密时,Google 不接受它。
这是我发送给 Google 的原始代码:
//create a template of the user to update
var body = new Google.Apis.Admin.Directory.directory_v1.Data.User();
//Encrypt the password using SHA1
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(model.NewPassword);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] password = sha.ComputeHash(bytes);
//Put the password and hash function into the request body
body.HashFunction = "SHA-1";
body.Password = password.ToString();
//send the request
var request = users.Update(body, email);
request.execute();
当我运行这个时,它会抛出一个错误提示密码无效。
当我更改它以便它发送严格的十六进制时,就像这样
//create a template of the user to update
var body = new Google.Apis.Admin.Directory.directory_v1.Data.User();
//Encrypt the password using SHA1
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(model.NewPassword);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] password = sha.ComputeHash(bytes);
//Convert the hashcode to Hex
System.Text.StringBuilder builder = new System.Text.StringBuilder();
for (int i = 0; i < password.Length; i++)
{
builder.Append(password[i].ToString("x2"));
}
//Put the password and hash function into the request
body.HashFunction = "SHA-1";
body.Password = builder.ToString();
//send the request
var request = users.Update(body, email);
request.execute();
然后 Google 接受了我给它的内容,但是进入帐户后,我无法访问它,因为密码已更改为完全不同的内容。
我只是错误地加密了密码,还是我遗漏了什么?
(免责声明:我为 Google 工作,但我之前没有看过这个 API。)
好吧,当您调用 password.ToString()
时出现的问题是它没有提供十六进制表示 - 所以这就是第一段代码失败的原因。看起来它基本上是期望它是十六进制的。 documentation 状态:
We recommend sending the password property value as a base 16 bit encoded hash value. If a hashFunction is specified, the password must be a valid hash key.
现在,我 怀疑 第二段代码的问题是你将原始 text 密码转换为字节的方式.您正在使用:
Encoding.Unicode.GetBytes(model.NewPassword)
那是使用小端 UTF-16。虽然文档没有 声明 预期的编码,但使用 UTF-8 会更常见。所以我建议使用
Encoding.UTF8.GetBytes(model.NewPassword)
取而代之...然后像以前一样对结果进行哈希处理和十六进制编码。
这只是一个有根据的猜测,但值得一试。
我目前正在使用 Google 的目录 API 开发一个程序来重置我域中某人的密码。我一切正常,但我想将加密密码发送到 Google 而不是明文。 由于 API 似乎限制了我可以用来加密的内容,我正在尝试使用 SHA-1 来加密。问题是,当我用 SHA-1 加密时,Google 不接受它。
这是我发送给 Google 的原始代码:
//create a template of the user to update
var body = new Google.Apis.Admin.Directory.directory_v1.Data.User();
//Encrypt the password using SHA1
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(model.NewPassword);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] password = sha.ComputeHash(bytes);
//Put the password and hash function into the request body
body.HashFunction = "SHA-1";
body.Password = password.ToString();
//send the request
var request = users.Update(body, email);
request.execute();
当我运行这个时,它会抛出一个错误提示密码无效。
当我更改它以便它发送严格的十六进制时,就像这样
//create a template of the user to update
var body = new Google.Apis.Admin.Directory.directory_v1.Data.User();
//Encrypt the password using SHA1
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(model.NewPassword);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] password = sha.ComputeHash(bytes);
//Convert the hashcode to Hex
System.Text.StringBuilder builder = new System.Text.StringBuilder();
for (int i = 0; i < password.Length; i++)
{
builder.Append(password[i].ToString("x2"));
}
//Put the password and hash function into the request
body.HashFunction = "SHA-1";
body.Password = builder.ToString();
//send the request
var request = users.Update(body, email);
request.execute();
然后 Google 接受了我给它的内容,但是进入帐户后,我无法访问它,因为密码已更改为完全不同的内容。
我只是错误地加密了密码,还是我遗漏了什么?
(免责声明:我为 Google 工作,但我之前没有看过这个 API。)
好吧,当您调用 password.ToString()
时出现的问题是它没有提供十六进制表示 - 所以这就是第一段代码失败的原因。看起来它基本上是期望它是十六进制的。 documentation 状态:
We recommend sending the password property value as a base 16 bit encoded hash value. If a hashFunction is specified, the password must be a valid hash key.
现在,我 怀疑 第二段代码的问题是你将原始 text 密码转换为字节的方式.您正在使用:
Encoding.Unicode.GetBytes(model.NewPassword)
那是使用小端 UTF-16。虽然文档没有 声明 预期的编码,但使用 UTF-8 会更常见。所以我建议使用
Encoding.UTF8.GetBytes(model.NewPassword)
取而代之...然后像以前一样对结果进行哈希处理和十六进制编码。
这只是一个有根据的猜测,但值得一试。