如何通过 C# 生成安全的 Base64 URL 字符串?

咨询区

  • Vishvesh Phadnis

在 C# 中如何实现对 URL 进行安全的 base64 编码,在 JAVA 中我可以使用 Codec 类库来实现此功能,我目前是这么实现的。

byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);

但上面这样做,会有 == 字符,这样会被当作url参数处理的,请问是否有更好的方式处理。

回答区

  • Kevinoid

如果你用的是 ASP.NET Core ,你可以使用 Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode 类,参考如下代码:

const string StringToEncode = "He=llo+Wo/rld";var encodedStr = Base64UrlEncoder.Encode(StringToEncode);
var decodedStr = Base64UrlEncoder.Decode(encodedStr);if (decodedStr == StringToEncode)Console.WriteLine("It works!");
elseConsole.WriteLine("Dangit!");

如果你的程序非 ASP.NET Core 的话, 可以使用 WebEncoders

public static byte[] Base64UrlDecode(string input, int offset, char[] buffer, int bufferOffset, int count){if (input == null){throw new ArgumentNullException(nameof(input));}if (buffer == null){throw new ArgumentNullException(nameof(buffer));}ValidateParameters(input.Length, nameof(input), offset, count);if (bufferOffset < 0){throw new ArgumentOutOfRangeException(nameof(bufferOffset));}if (count == 0){return Array.Empty<byte>();}// Assumption: input is base64url encoded without padding and contains no whitespace.var paddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count);var arraySizeRequired = checked(count + paddingCharsToAdd);Debug.Assert(arraySizeRequired % 4 == 0, "Invariant: Array length must be a multiple of 4.");if (buffer.Length - bufferOffset < arraySizeRequired){throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,EncoderResources.WebEncoders_InvalidCountOffsetOrLength,nameof(count),nameof(bufferOffset),nameof(input)),nameof(count));}// Copy input into buffer, fixing up '-' -> '+' and '_' -> '/'.var i = bufferOffset;for (var j = offset; i - bufferOffset < count; i++, j++){var ch = input[j];if (ch == '-'){buffer[i] = '+';}else if (ch == '_'){buffer[i] = '/';}else{buffer[i] = ch;}}// Add the padding characters back.for (; paddingCharsToAdd > 0; i++, paddingCharsToAdd--){buffer[i] = '=';}// Decode.// If the caller provided invalid base64 chars, they'll be caught here.return Convert.FromBase64CharArray(buffer, bufferOffset, arraySizeRequired);}

详细内容可以参见 github:https://github.com/dotnet/aspnetcore/blob/main/src/Shared/WebEncoders/WebEncoders.cs

当然,你如果不嫌麻烦,可以手工处理。

public string Decode(string str){byte[] decbuff = Convert.FromBase64String(str.Replace(",", "=").Replace("-", "+").Replace("/", "_"));return System.Text.Encoding.UTF8.GetString(decbuff);}public string Encode(string input){byte[] encbuff = Encoding.UTF8.GetBytes(input ?? "");return Convert.ToBase64String(encbuff).Replace("=", ",").Replace("+", "-").Replace("_", "/");}

点评区

这个问题相信很多朋友都遇到过,导致 url 中的 base64 的一部分当成了参数处理,后来没办法只能将需要 base64 的参数放到了 post body 中,现在终于知道怎么解决了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

System.getProperty()参数

java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor Java 虚拟机规范供应商 java.vm.specificat…

不变模式

不变模式 不变模式&#xff08;immutable pattern&#xff09; 一个类的内部状态创建后&#xff0c;在整个生命期间都不会发生变化时&#xff0c;就是不变类。这种使用不变类的做法叫做不变模式。 不变模式有两种形式&#xff1a;一种是弱不变模式&#xff0c;另一种是强不变模…

了解SQL Server触发器及触发器中的事务

引述 首先&#xff0c;写这篇文章的目的是望能把我对触发器的理解&#xff0c;分享出来与大家一起学习。如果你对触发器和事务的概念有些了解&#xff0c;这篇文章对你来说会是很简单&#xff0c;或能让你更进一步的了解触发器里面的一些故事&#xff0c;以及触发器中事务的故…

swift学习笔记-----swift中的指针

swift语言为了简化&#xff0c;把指针隐形化了。没有像OC中那样的“ * ”。把底层的问题交给C语言去处理&#xff0c;我们可以在swift中调用C 语言来解决。当然&#xff0c;OC也是可以调用的。但是在某些场景下&#xff0c;这种调用可能不是很方便。比如&#xff0c;基于字节流…

多个php一个机器,如何利用docker在同一台机器上搭建多套php开发环境?

首先是一个容器要包含完整的程序加依赖(出去中间件)&#xff0c;拿 LNMP 举例子&#xff1a;docker 提供的是 Linux 环境&#xff0c;容器中要包含 Nginx 和 Php&#xff0c;然后再单独部署一个 MySQL其次&#xff0c;如果多个环境&#xff0c;可以使用多个容器&#xff0c;简单…

Android之Android studio如何解决Multiple dex files define Landroid/support/a(文件重复引用错误)

先爆错误的图片照,如下 define 可以理解文件重复的意思,所以这个错误是我导入了v4.jar包的原因,因为我项目里面本来就有v7.jar,如下图 解决办法一: 既然重复了,我就把这个v4.jar包删除掉,我删了之后就可以了,这个方法的前提是我知道哪个包重复了,不然我也不知道删除…

winform进度条实现

最近要给一个 Winform 项目添加功能&#xff0c;需要一个能显示进度条的弹窗&#xff0c;还要求能够中止任务&#xff0c;所以就做了一个&#xff0c;在此做个记录总结。虽然用的是比较老的 Winform 技术&#xff0c;不过其中的原理都是相通的。loading随处可见&#xff0c;比如…

keil之编辑环境配置

1.edit-->configuration 2. 3.开始是&#xff1a;ANSI编码&#xff0c;但一去掉&#xff1a;display modules&#xff0c;中文的注视就乱码了&#xff1b;请教Justchen&#xff0c;把编码改为GB2312&#xff0c;一切恢复正常&#xff1b;转载于:https://www.cnblogs.com/itl…

邮件服务器在企业网中的应用

简介&#xff1a; 电子邮件是因特网上最为流行的应用之一。如同邮递员分发投递传统邮件一样&#xff0c;电子邮件也是异步的&#xff0c;也就是说人们是在方便的时候发送和阅读邮件的&#xff0c;无须预先与别人协同。与传统邮件不同的是&#xff0c;电子邮件既迅速&#xff0c…

安卓事件机制与页面跳转

昨天学习了安卓开发中实现点击一个按钮实现页面的跳转。 首先点击一个按钮就会触发动作&#xff0c;这里就是给按钮加监听。一般对于事件监听&#xff0c;我们需要了解以下三类对象&#xff1a;事件源、事件、事件监听器&#xff0c;一般在安卓里&#xff0c;事件源就是指在哪个…

适配Win11!Edge重磅更新来袭

夜聊近日&#xff0c;微软对 Microsoft Edge 浏览器进行了两次重大更新。Microsoft Edge 95 正式版主要更新内容&#xff1a;版本号&#xff1a;95.0.1020.301.Microsoft Edge 右键菜单现已适配 Windows 11 风格&#xff0c;采用 Acrylic 和圆角设计&#xff0c;更加美观。2.你…

php 重定向到https,php – Laravel 5 – 重定向到HTTPS

您可以使它与中间件类工作。让我给你一个想法。namespace MyApp\Http\Middleware;use Closure;class HttpsProtocol {public function handle($request, Closure $next){if (!$request->secure() && env(APP_ENV) prod) {return redirect()->secure($request-&g…

被清华免试录取的围棋天才,横扫60位围棋大师的最强AI,竟然都输给了高中生!?...

全世界只有3.14 % 的人关注了爆炸吧知识术业有专攻前不久&#xff0c;漫改剧《棋魂》的热播&#xff0c;让围棋狠狠火了一把。图片来源于豆瓣火到什么程度&#xff1f;有网友看完直接就打开了B站的围棋教程。但大部分网友&#xff0c;学不到几天就弃坑了&#xff0c;理由是&…

android项目中values中几个文件的作用

最近反编译了几个Android软件&#xff0c;发现一些以前未用到的资源文件&#xff1a;ids.xml——为应用的相关资源提供唯一的资源id。id是为了获得xml中的对象而需要的参数&#xff0c;也就是Object findViewById(R.id.id_name)中的id_name。这些值可以在代码中用android.R.id…

JS特效代码

1.文本框焦点问题 onBlur:当失去输入焦点后产生该事件 onFocus:当输入获得焦点后&#xff0c;产生该文件 Onchange:当文字值改变时&#xff0c;产生该事件 Onselect:当文字加亮后&#xff0c;产生该文件 <input type"text" value"mm" οnfοcus"if…

Android之如何解决Listview里面的值出现了2次

Listview里面的值出现了2次 不废话,先爆照 我去,这个listview里面的值怎么出现了2次,一直在找原因,后来解决了,先看下我的部分代码吧。 这是mainactivity.xml内容 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools=…

php prettyprinter,gdb运行时错误:prettyprinter已注册:libstdc++v6

我的全球分销银行与wiki中的相同&#xff0c;只是我将路径替换为打印机.py. 在pythonimport syssys.path.insert(0, C:/Program Files (x86)/mingw-builds/x32-4.8.1-posix-dwarf-rev3/mingw32/share/gcc-4.8.1/python/libstdcxx/v6)from printers import register_libstdcxx_p…

C# 10 新特性 —— 插值字符串优化

C# 10 新特性 —— 插值字符串优化Intro字符串应该是我们平时使用的最多的一个类型&#xff0c;从 C# 6 开始我们开始支持了插值字符串&#xff0c;使得我们可以更方便的进行字符串的操作&#xff0c;现在很多分析器也推荐我们使用插值这种写法&#xff0c;这能够使得我们的代码…

电影院为何有散落的青瓜?

1 摄像头&#xff1a;你套个袋子我就认不出来了吗&#xff1f;▼2 路边惊现大熊猫&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 好一个驼小姐&#xff08;via.豆瓣社死小组满杯草莓&#xff09;▼4 学弟的理解也不是无迹可寻▼5 台湾人过生日的方…

【ACM】nyoj_305_表达式求值_201308081018

表达式求值时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;3描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后&#xff0c;最近又学会了一些简单的函数求值&#xff0c;比如&#xff0c;它知道函数min(20,23)的值是20 &#xff0c;add(10,98…