我想在C#中实现Base64 URL安全编码.在Java中,我们有一个公共Codec库,它为我提供了一个URL安全编码字符串.如何使用C#实现相同的目标?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
Run Code Online (Sandbox Code Playgroud)
上面的代码将它转换为Base64,但它填充==.有没有办法实现URL安全编码?
问题:有更好的方法吗?
VB.Net
Function GuidToBase64(ByVal guid As Guid) As String
Return Convert.ToBase64String(guid.ToByteArray).Replace("/", "-").Replace("+", "_").Replace("=", "")
End Function
Function Base64ToGuid(ByVal base64 As String) As Guid
Dim guid As Guid
base64 = base64.Replace("-", "/").Replace("_", "+") & "=="
Try
guid = New Guid(Convert.FromBase64String(base64))
Catch ex As Exception
Throw New Exception("Bad Base64 conversion to GUID", ex)
End Try
Return guid
End Function
Run Code Online (Sandbox Code Playgroud)
C#
public string GuidToBase64(Guid guid)
{
return Convert.ToBase64String(guid.ToByteArray()).Replace("/", "-").Replace("+", "_").Replace("=", "");
}
public Guid Base64ToGuid(string base64)
{
Guid guid = default(Guid);
base64 = …Run Code Online (Sandbox Code Playgroud) 我正在使用Azure存储表,我有数据进入RowKey,其中包含斜杠.根据此MSDN页面,PartitionKey和RowKey中不允许使用以下字符:
正斜杠(/)字符
反斜杠()字符
数字符号(#)字符
问号(?)字符
控制字符从U + 0000到U + 001F,包括:
水平制表符(\ t)字符
换行符(\n)字符
回车(\ r)字符
控制字符从U + 007F到U + 009F
我见过有些人使用URL编码来解决这个问题.不幸的是,这可能会产生一些问题,例如能够插入但无法删除某些实体.我也看到有些人使用base64编码,但是这也可以包含不允许的字符.
如何在不运行不允许的字符或滚动自己的编码的情况下有效编码RowKey?
所以我很难过.我知道有很多用于JS的Base64编码器/解码器,但不适用于修改过的(和Facebook赞成的)Base64URL变体.到目前为止,搜索stackoverflow已经变得干涸.
是的,我可以使用PHP或其他服务器端库对此进行解码,但我试图保持这种通用性,无论我使用什么平台...例如,如果我要托管一个仅限HTML的Facebook应用程序在Amazon S3/CloudFront上,只使用他们的JS SDK和jQuery来处理表单和获取数据.
也就是说,有没有人知道任何针对JavaScript的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"
每个OpenID Connect提供程序都会发布包含jwks_uri属性的发现文档.从这里返回的数据jwks_uri似乎有两种不同的形式.一个表单包含名为x5c和的字段x5t.这样的一个例子如下:
{
"keys": [
{
"kty": "RSA",
"use": "sig",
"kid": "C61F8F2524D080D0DB0A508747A94C2161DEDAC8",
"x5t": "xh-PJSTQgNDbClCHR6lMIWHe2sg", <------ HERE
"e": "AQAB",
"n": "lueb...",
"x5c": [
"MIIC/..." <------ HERE
],
"alg": "RS256"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我看到的另一个版本省略了x5c和x5t属性但包含e和n.一个例子是:
{
"keys": [
{
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"kid": "cb11e2f233aee0329a5344570349cddb6b8ff252",
"n": "sJ46h...", <------ HERE
"e": "AQAB" <------ HERE
}
]
}
Run Code Online (Sandbox Code Playgroud)
我不太明白区别是什么,为什么有时会使用x5c/x5t组合,但有时候只是简单e/n.我正在使用C#Microsoft.IdentityModel.Tokens.TokenValidationParameters,我正在试图找出如何供应该物业IssuerSigningKey.此类的示例用法是
new TokenValidationParameters
{
ValidateAudience …Run Code Online (Sandbox Code Playgroud) 如果您有需要编码的二进制数据,您使用的编码方案是什么?
我知道:
是否有其他常用的编码方案?如果是这样,有什么优点和缺点?
编辑:这很有用,例如,当尝试在cookie中存储任意数据时.Cookie只能存储文本,而不能存储任意数据,因此您需要以某种方式对其进行转换,最好是将其转换回来.此外,假设您正在使用无状态服务器,以便您无法在服务器上保存状态,只需将标识符放入cookie即可.当然,如果你这样做,你还需要一些方法来验证用户传递给你的是你传递给用户的内容,例如签名.
此外,由于目前的共识是你应该使用base64,因为它很普遍,我也会指出这是我使用的...我只是好奇,如果有人使用其他任何东西,如果是这样,为什么.
编辑:万一有人偶然发现,如果您确实想使用Base64将数据存储在cookie中,则需要使用修改后的Base64实现.看到这个答案的原因.
如何实现Linkedin的登录方法,人们只需点击一个按钮并使用他们的Linkedin帐户登录,就像在Facebook或Twitter上一样?两者都使用OAuth,但我发现它们的指定库很容易使用.对于LinkedIn我只发现DotNetOpenAuth一些示例代码,但我不能让任何意义了它.
是否有任何库可用于促进Linkedin的登录功能?或者有关如何使用DotNetOpenAuth 4在ASP.NET MVC中执行此操作的任何教程?
我在KickAssTorrents.com上浏览种子,当我访问链接时,它以不同的方式编码在网址中;
例如(IMDb链接):http://kat.ph/account/confirm/url/aHR0cDovL3d3dy5pbWRiLmNvbS90aXRsZS90dDA0MDE3Mjk=/
现在,当我更改角色时,链接中的某些内容会发生变化,我想知道如何在C#或jQuery中执行此操作?
如何使用x509证书签署json文档或字符串?
public static void fund()
{
string filePath = @"C:\Users\VIKAS\Desktop\Data.xml";
//Read the file
XmlDocument xmlDoc = new XmlDocument();
XElement ele = XElement.Load(filePath);
String Xml = ele.ToString();
xmlDoc.LoadXml(Xml);
string signature = SignedXMLCert(xmlDoc);
bool verified = ValidateSignature(signature);
}
public static string SignedXMLCert(XmlDocument xmlDoc)
{
string startupPath = AppDomain.CurrentDomain.BaseDirectory + @"Certificates\unidesk.p12";
// startupPath = AppDomain.CurrentDomain.BaseDirectory + @"\Certificates\BBPS_enc.cer";
//X509Certificate2 cert = new X509Certificate2(@"D:\Sonal\AXISOU_TEST.P12", "axisbank", X509KeyStorageFlags.Exportable);
X509Certificate2 cert = new X509Certificate2(startupPath, "axisbank", X509KeyStorageFlags.Exportable);
// string PrivateKey = GetRSAPrivateKeyBase64(cert);
var privateKey = cert.PrivateKey as RSACryptoServiceProvider;
SignedXml …Run Code Online (Sandbox Code Playgroud) 我正在使用node.bcrypt.js哈希返回node.js中的十六进制数字作为密码重置令牌.
user.reset_password_token = require('crypto').randomBytes(32).toString('hex'
);
Run Code Online (Sandbox Code Playgroud)
在我在网址中传递令牌之前,我是否还应该对该令牌进行base64编码(即:链接重置电子邮件)?
这样做有什么好处吗?
我似乎记得base64编码可以包含正斜杠,这会弄乱路径:
var token = user.reset_password_token;
//is there any benefit to doing base64 encoding?
var encoded_token = new Buffer(token).toString('base64');
var reset_link = 'http://example.com/reset/'+ encoded_token;
sendResetLink( reset_link );
Run Code Online (Sandbox Code Playgroud) 我在这里用头撞墙,用这个简单的代码不起作用:
string middle = "eyJzdWIiOiJtYXR0d2ViZXIiLCJqdGkiOiJlMWVmNjc5Mi02YTBjLTQ4YWUtYmQzNi0wZDlmMTVlMDFiY2UiLCJpYXQiOjE0OTMwOTI0OTQsIm5iZiI6MTQ5MzA5MjQ5NCwiZXhwIjoxNDkzMjY1Mjk0LCJpc3MiOiJFQ29tbVdlYkFQSTIiLCJhdWQiOiJFQ29tbVdlYkNsaWVudDIifQ"
byte[] newBytes = Convert.FromBase64String(middle);
middle = Encoding.UTF8.GetString(newBytes);
Run Code Online (Sandbox Code Playgroud)
就这么简单!然而我在标题中得到了错误.
另外,我在https://www.base64decode.org/上运行它,它完美地解码.