C#/ powershell将数字签名编码为base 64并对其进行解码并对其进行身份验证。

时间:2014-07-11 15:40:01

标签: c# powershell encoding base64 digital-signature

您好我正在尝试在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;
        }

提前致谢,

0 个答案:

没有答案