【问题标题】:Validating Base64 Encoded String验证 Base64 编码的字符串
【发布时间】:2012-10-13 10:31:25
【问题描述】:

对于以下代码,当我尝试对字符串进行 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=" -> 我得到一个带有一些变音字符的明文。有没有一种方法可以验证和克服这一点。请回复。 提前致谢。

【问题讨论】:

  • 为什么要在 Base64 编码的字符串中添加额外的字符?
  • 作为安全措施。 “Hello world 只是一个例子”。如果解析将用作参数的敏感字符串怎么办?所以它确实解码了字符串,但响应不正确。为什么我宁愿验证然后解析编码的字符串是否完全有效并在解码时匹配模式?
  • Base64 只是一种将任意字节编码为文本格式的方法。它与安全没有任何关系。如果您想确保从第三方收到的某些文本没有被中间人修改,请使用加密签名。

标签: java string base64 encode


【解决方案1】:

您自己验证 base-64 字符串的能力非常有限:只要编码的字符串具有正确的长度(即长度,包括尾随等号,可以被 4 整除)并且字符串由只有正确的 base64 字符,它被认为是一个有效的字符串。

如果您需要对消息进行防篡改,您需要准备一段额外的数据来描述原始文本,并将其与您的 base64 编码数据一起传递到目的地。在最简单的情况下,它可能是文本的校验和,但这种方案很容易被击败。更好的方法是使用 cryptographic hash function 准备原始文本的摘要,并将该摘要与 base64 编码文本一起传递到目的地。

请记住,传递摘要不会阻止man-in-the-middle attacks,因为攻击者可以发送他自己的摘要以及被篡改的消息。

【讨论】:

  • 包含秘密的摘要,例如 sha1(plaintext + password) 可用于检测 MITM 的篡改。
猜你喜欢
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2018-12-28
  • 2012-11-13
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多