相关疑难解决方法(0)

用于解码/编码修改后的base64 URL的代码

我想base64编码数据把它放在一个URL中,然后在我的HttpHandler中解码它.

我发现Base64编码允许使用'/'字符,这会弄乱我的UriTemplate匹配.然后我发现维基百科有一个"修改过的Base64 for URL"的概念:

存在修改的URL变体Base64,其中不使用填充'=',标准Base64的'+'和'/'字符分别替换为' - '和'_',因此使用URL编码器/解码器不再需要,并且对编码值的长度没有影响,保留相同的编码形式,以便在关系数据库,Web表单和对象标识符中使用.

使用.NET我想修改我当前的代码,从基本的base64编码和解码到使用"修改的base64 for URL"方法.有没有人这样做过?

为了解码,我知道它开头是这样的:

string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');

// Append '=' char(s) if necessary - how best to do this?

// My normal base64 decoding now uses encodedText
Run Code Online (Sandbox Code Playgroud)

但是,我需要在结尾处添加一个或两个'='字符,这看起来有点复杂.

我的编码逻辑应该更简单一些:

// Perform normal base64 encoding
byte[] encodedBytes = Encoding.UTF8.GetBytes(unencodedText);
string base64EncodedText = Convert.ToBase64String(encodedBytes);

// Apply URL variant
string base64UrlEncodedText = base64EncodedText.Replace("=", String.Empty).Replace('+', '-').Replace('/', '_');
Run Code Online (Sandbox Code Playgroud)

我已经看到Guid to Base64用于URL StackOverflow条目,但是它具有已知长度,因此它们可以硬编码最后所需的等号数.

c# url base64 encode decode

108
推荐指数
5
解决办法
9万
查看次数

使用System.IdentityModel.Tokens.Jwt解码和验证JWT令牌

我一直在使用JWT库来解码Json Web Token,并希望切换到Microsoft的官方JWT实现System.IdentityModel.Tokens.Jwt.

文档非常稀疏,所以我很难弄清楚如何完成我在JWT库中所做的工作.使用JWT库,有一个Decode方法,它采用base64编码的JWT并将其转换为JSON,然后可以对其进行反序列化.我想使用System.IdentityModel.Tokens.Jwt做类似的事情,但经过大量的挖掘,无法弄清楚如何.

为了它的价值,我正在从cookie中读取JWT令牌,以便与Google的身份框架一起使用.

任何帮助,将不胜感激.

.net wif jwt

90
推荐指数
2
解决办法
9万
查看次数

C#Byte []到Url友好字符串

我正在为一个我正在整理的简单网站开发快速验证码生成器,我希望在页面的URL中传递加密密钥.我可能很容易做到这一点作为一个查询字符串参数,但我希望不是这样(只是因为没有其他任何东西跑掉查询字符串)...

我的加密代码生成一个byte [],然后使用Convert.ToBase64String(byte [])将其转换为字符串.但是,这个字符串仍然不是友好的url,因为它可以包含'/'和'='之类的东西.有没有人知道.NET框架中更好的函数将字节数组转换为url友好字符串?

我知道所有关于System.Web.HttpUtility.UrlEncode()及其等价物,但是,它们只适用于查询字符串参数.如果我在路径内部对"="进行url编码,我的Web服务器会返回400 Bad Request错误.

无论如何,不​​是一个关键问题,但希望有人能给我一个很好的解决方案

**编辑:只是为了绝对确定我正在用字符串做什么,我想我会提供更多信息.

由我的加密算法产生的byte []应该通过某种算法提供,以使其成为url友好字符串.在此之后,它将成为XElement的内容,然后将其用作XSLT转换的源文档,并用作锚点的href属性的一部分.我不相信xslt转换导致问题,因为路径上出现的内容似乎是编码的查询字符串参数,但会导致HTTP 400

我也在base64字符串上尝试过HttpUtility.UrlPathEncode(),但这似乎也没有做到(我仍然在我的网址中以'/'结尾)**

c# base64 friendly-url

27
推荐指数
2
解决办法
2万
查看次数

如何使用Gmail API阅读整个邮件

我需要身体中的所有文本来接收电子邮件.

我试过了:

var mesage = GetMessage(service, "me", 1);
Console.WriteLine(mesage.Snippet);

public static Message GetMessage(GmailService service, String userId, String messageId)
{
    try
    {
        return service.Users.Messages.Get(userId, messageId).Execute();
    }
    catch (Exception e)
    {
        Console.WriteLine("An error occurred: " + e.Message);
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

但我正在获取截图中显示的片段.

收到的邮件给我: 在此输入图像描述 结果:

在此输入图像描述

c# gmail-api

10
推荐指数
1
解决办法
4946
查看次数

Convert.ToBase64String(byte [])和HttpServerUtility.UrlTokenEncode(byte [])有什么区别?

我试图消除对System.Web.dllWeb API项目的依赖,但偶然发现了一个调用HttpServerUtility.UrlTokenEncode(byte[] input)(和它相应的解码方法),我不知道要替换什么以确保向后兼容性.文档说这个方法

使用64位数字将字节数组编码为等效的字符串表示,可用于在URL上传输.

我尝试用Convert.ToBase64String(byte[] input)(及其相应的解码方法)代替,这在文档中非常类似地描述:

将一个8位无符号整数数组转换为其等效的字符串表示形式,该表示形式使用base-64数字进行编码.

但是,它们似乎并不完全等同; 当Convert.FromBase64String(string input)用于解码用其编码的字符串时HttpServerUtility,我得到一个异常说明

输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非法字符.

这两个转换实用程序有什么区别?消除这种依赖的正确方法是System.Web.HttpServerUtility什么?


有些用户建议这与此相关,但我不同意.这个问题是关于编码基64字符串的URL安全的方式一般,但我需要重现具体行为HttpServerUtility,但没有一个依赖System.Web.

c# base64 system.web

10
推荐指数
2
解决办法
4776
查看次数

根据RFC4648,C#:base64url

我正在根据C#中的RFC4648寻找base64url的(快速)标准实现.

我发现HttpServerUtility.UrlTokenEncode但看起来这并不遵循RFC4648(UrlTokenEncode在末尾添加一个数字,表示=已删除的符号数量;请参阅此处此处).

例:

base64编码:

Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes( "AA")); //返回"QUE ="

base64url编码:

HttpServerUtility.UrlTokenEncode(System.Text.Encoding.ASCII.GetBytes( "AA")); //返回"QUE1",但我希望"QUE"

c# base64 urlencode url-encoding

8
推荐指数
1
解决办法
2849
查看次数

使用带有密码私钥的RSA解密消息使用C#中的pem文件

我正在尝试解码HelloWorks回调签名以增加端点的安全性.由于它保留在文档中,我需要使用以下openssl命令生成私钥:

openssl genrsa -des3 -out helloworks.pem 4096
Run Code Online (Sandbox Code Playgroud)

然后创建公钥:

openssl rsa -in helloworks.pem -outform PEM -pubout -out public.pem
Run Code Online (Sandbox Code Playgroud)

我创建了两个密钥并对其进行了配置.现在我需要解码base64由他们发送的X-Helloworks-Signature,然后使用私钥解密结果.

我一直在尝试用C#做几种方法,但没有运气.我使用BouncyCastle库完成的一种方法是:

        var signature = mvcContext.HttpContext.Request.Headers["X-Helloworks-Signature"];

        var url = mvcContext.HttpContext.Request.Path.Value;

        var bytesToDecrypt = Convert.FromBase64String(signature);

        AsymmetricCipherKeyPair keyPair;

        var pemPath = Path.Combine(env.ContentRootPath, "./helloworks.pem");
        using (var reader = File.OpenText(pemPath))
            keyPair = (AsymmetricCipherKeyPair)new PemReader(reader, new PasswordFinder("password")).ReadObject();

        var decryptEngine = new Pkcs1Encoding(new RsaEngine());
        decryptEngine.Init(false, keyPair.Private);

        var decryptedToken = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));
Run Code Online (Sandbox Code Playgroud)

但它总是抛出相同的异常消息:

Org.BouncyCastle.Crypto.DataLengthException: 'input too large for RSA cipher.'
Run Code Online (Sandbox Code Playgroud)

我一直在尝试我在SO和网络上找到的其他方法,但没有运气.

如何使用私钥pem文件解密C#中的签名,特别是.Net Core 2?

更新1 …

c# encryption bouncycastle pem .net-core-2.0

6
推荐指数
1
解决办法
629
查看次数

需要加密/解密方法在加密字符串中没有'/'

我需要加密和解密字符串值,例如电子邮件地址和数值,但加密的字符串中不应包含'/',因为我在URL中使用它并使用'/'作为分隔符来获取某些值.

我目前正在使用以下方法:

    string passPhrase = "Pas5pr@se";        // can be any string
    string saltValue = "s@1tValue";        // can be any string
    string hashAlgorithm = "SHA1";             // can be "MD5"
    int passwordIterations = 2;                  // can be any number
    string initVector = "@1B2c3D4e5F6g7H8"; // must be 16 bytes
    int keySize = 256;                // can be 192 or 128

    public string Encrypt(string plainText)
    {            
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);         
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase,saltValueBytes,hashAlgorithm,passwordIterations);
        byte[] keyBytes …
Run Code Online (Sandbox Code Playgroud)

c# asp.net

5
推荐指数
1
解决办法
4300
查看次数

使用Base64UrlEncode的语句

我试图通过代码发送电子邮件,我遇到了障碍.当Base64UrlEncode出现红色时,我正在解决这个问题.我的代码中有相同的using语句.

using System;
using System.IO;
using System.Net.Mail;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MyCompany.Sample.EmailConnector.Model;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Gmail.v1;
using Google.Apis.Gmail.v1.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;
...
    public static Message createGmailMessage(AE.Net.Mail.MailMessage mailMessage)
    {
        var messageString = new StringWriter();
        mailMessage.Save(messageString);
        Message gmailMessage = new Message();
        gmailMessage.Raw = Base64UrlEncode(messageString.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

如何启用"Base64UrlEncode"?

c# gmail-api

4
推荐指数
1
解决办法
6566
查看次数