您好我正在尝试在POST请求的Authorization标头内填充数字签名。
我需要按要求使用powershell,但实际的数字签名是在我从powershell内部调用的c#类中完成的。
$obj = new-object DigitalSignatureApplication.DigitalSignature
$signature = $obj.GetSignature($certificateName,$Message)
与认证部分相同
$verification = $obj.verifySignature($signature64,$certificateName,$Message)
我们的想法是在PowerShell中对签名进行编码,然后在POST请求中将其发送出去,然后将其解码并对签名进行身份验证。
$signatureBytes = [System.Text.Encoding]::UTF8.GetBytes($signature)
$signature64 = [System.Convert]::ToBase64String($signatureBytes)
$headers = @{Authorization = "DSignature "+$signature64}
问题在于,在将其编码为base64并将其解码之后,有些东西会破坏签名并且身份验证失败,我已经尝试过纯粹在c#中进行编码和解码,但即使这样也不起作用。
以下是我在C#中的签名逻辑
byte[] buffer = Encoding.Default.GetBytes(UnsignedMessage);
byte[] signature = privateKey.SignData(buffer, new SHA1Managed());
return EncodeTo64(GetString(signature)); // converting to base 64 before returning
// return GetString(signature); // just converting the byte [] to a string
这是我在C#
中的验证/验证逻辑 byte[] buffer = Encoding.Default.GetBytes(message);
string decodedSigneture = DecodeFrom64(encodedsignature);
byte[] signaturebytes = GetBytes(decodedSigneture);
bool verify = publicKey.VerifyData(buffer, new SHA1Managed(), signaturebytes);
以下是我获取字符串和获取字节的逻辑。
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
static string GetString(byte[] bytes)
{
char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
}
以下是我尝试过的基于64个进程的两种不同编码和解码方式....
public static string Base64Encode(string plainText)
{
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
return System.Convert.ToBase64String(plainTextBytes);
}
public static string Base64Decode(string base64EncodedData)
{
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}
static public string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
static public string DecodeFrom64(string encodedData)
{
byte[] encodedDataAsBytes
= System.Convert.FromBase64String(encodedData);
string returnValue =
System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
return returnValue;
}
提前致谢,