正在尝试使用 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)

取而代之...然后像以前一样对结果进行哈希处理和十六进制编码。

这只是一个有根据的猜测,但值得一试。