JSP(Java):编码字节数组并在JavaScript中使用,与C中相同#

JSP(Java):编码字节数组并在JavaScript中使用,与C中相同#,java,c#,jsp,encoding,base64,Java,C#,Jsp,Encoding,Base64,我在C#.net中使用此代码将挑战发送到网页 RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); Byte[] rnd = new Byte[64]; rng.GetBytes(rnd); hidChallenge.Value = Encoding.Unicode.GetString(rnd); 我在java脚本中使用它 var base64str = do

我在C#.net中使用此代码将挑战发送到网页

        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        Byte[] rnd = new Byte[64];
        rng.GetBytes(rnd);
        hidChallenge.Value = Encoding.Unicode.GetString(rnd);
我在java脚本中使用它

var base64str = document.getElementById("<%=hidChallenge.ClientID %>");
但是在java(JSP)中

我使用以下代码:

Random r = new Random();
byte[] rndbyte = new byte[64];
r.nextBytes(rndbyte);
String challenge = new String(rndbyte,StandardCharsets.UTF_16LE);                    
session.setAttribute("challenge", challenge);
在javascript中:

var base64str=퓻�ꦖ쁳春꼪ꝝ䣇͋ꟼ鱐䆺㺪᠁郷̣攺줶ꋏ歮㏹㬎ꢔ崬魔弝孓翊

我也尝试跟随charset:

美国ASCII码

UTF_8

UTF_16


所以我得到了Base64字符串错误。

听起来好像UTF-8/16或Ascii的用途与Base64之间存在混淆

UTF-8用于将字符串编码为字节序列。Base64用于将字节序列编码为字符串

如果您想在Java中生成base64,下面是它的外观:

Random r = new Random();
byte[] rndbyte = new byte[64];
r.nextBytes(rndbyte);
String challenge = Base64.encodeBase64String(rndbyte);                    
session.setAttribute("challenge", challenge);
如果你想了解更多,这里有另一篇文章可以很好地解释这一区别:

WTF?这不是base64。这是。。。好的,我已经看过了。如果两个字节在代理项范围内,则将中断。老实说,只需使用base64。
Random r = new Random();
byte[] rndbyte = new byte[64];
r.nextBytes(rndbyte);
String challenge = Base64.encodeBase64String(rndbyte);                    
session.setAttribute("challenge", challenge);