验证Base64编码的字符串

3
以下代码中,当我尝试对一个字符串进行base64编码时。
import org.apache.commons.codec.binary.Base64;

public class Codec {
  public static void main(String[] args) {
      String clrTxt = "Hello world";
      String encodedTxt;

      encodedText = new String(Base64.encodeBase64(clearText.getBytes()));
      System.out.println("Encoded: " + encodedText);
      System.out.println("Decoded:" 
          + new String(Base64.decodeBase64(encodedText.getBytes())));
      //    
      // output :
      //   Encoded: **SGVsbG8gd29ybGQ=**
      //   Decoded:Hello world      
  }
}

在编码字符串中,当我尝试插入一些额外的字符时,比如说 --> "SGVsb*G8ASDFASDFASDFASDFASDF1234234*gd29ybGQ=",我得到了一些带有变音符号的明文。是否有一种方法可以验证和克服这个问题。请回复。 非常感谢。


1
你为什么要在Base64编码的字符串中添加额外的字符呢? - JB Nizet
作为安全措施,“Hello world is just an example”仅仅是一个例子。如果解析的字符串是敏感的,并且将被用作参数,那该怎么办呢?如果解码后的字符串响应不当,为什么不先验证再解析呢?如果编码后的字符串完全有效并且匹配模式,那么为什么不进行验证和解析呢? - Venkat Pathy
3
Base64是一种将任意字节编码为文本格式的方式,与安全无关。如果您想确保从第三方接收到的某些文本没有被中间人篡改,请使用加密签名。 - JB Nizet
1个回答

3
您自己很难仅通过base64字符串验证它的有效性:只要编码后的字符串长度正确(即长度包括尾随的等号,可被四整除),并且该字符串仅由正确的base64字符组成,就被视为有效字符串。
如果您需要防篡改您的消息,则需要准备一份附加数据来描述原始文本,并将其与您的base64编码数据一起传递到目标。在最简单的情况下,它可以是文本的校验和,但这种方案很容易被攻击。更好的方法是使用密码哈希函数准备原始文本的摘要,并将该摘要与base64编码文本一起传递到目标。
请记住,传递摘要不会防止中间人攻击,因为攻击者可以发送自己的摘要以及篡改的消息。

1
一个包含秘密的摘要,例如 sha1(明文 + 密码) 可以用于检测中间人攻击的篡改。 - phatfingers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接