Как проверить, закодирована ли строка в base64 или нет - PullRequest
165 голосов
/ 20 декабря 2011

Я хочу декодировать строку в кодировке base64, а затем сохранить ее в своей базе данных.Если вход не кодируется в base64, мне нужно выдать ошибку.Как я могу проверить, была ли строка кодирована в base64?

Ответы [ 18 ]

1 голос
/ 25 ноября 2018

Невозможно проверить, закодирована ли строка в base64 или нет. Проверка возможна только в том случае, если эта строка имеет формат строки, закодированный в base64, что означает, что она может быть строкой, созданной кодировкой base64 (чтобы убедиться, что строка может быть проверена на соответствие регулярному выражению или может использоваться библиотека, многие другие ответы на этот вопрос предоставляют хорошие способы проверить это, поэтому я не буду вдаваться в подробности).

Например, строка flow является допустимой строкой в ​​кодировке base64. Но невозможно узнать, является ли это простая строка, английское слово flow, или это строка, закодированная в формате 64 ~Z0

1 голос
/ 29 апреля 2016

C # Отлично работает:

static readonly Regex _base64RegexPattern = new Regex(BASE64_REGEX_STRING, RegexOptions.Compiled);

private const String BASE64_REGEX_STRING = @"^[a-zA-Z0-9\+/]*={0,3}$";

private static bool IsBase64(this String base64String)
{
    var rs = (!string.IsNullOrEmpty(base64String) && !string.IsNullOrWhiteSpace(base64String) && base64String.Length != 0 && base64String.Length % 4 == 0 && !base64String.Contains(" ") && !base64String.Contains("\t") && !base64String.Contains("\r") && !base64String.Contains("\n")) && (base64String.Length % 4 == 0 && _base64RegexPattern.Match(base64String, 0).Success);
    return rs;
}
0 голосов
/ 04 ноября 2018

Это работает в Python:

import base64

def IsBase64(str):
    try:
        base64.b64decode(str)
        return True
    except Exception as e:
        return False

if IsBase64("ABC"):
    print("ABC is Base64-encoded and its result after decoding is: " + str(base64.b64decode("ABC")).replace("b'", "").replace("'", ""))
else:
    print("ABC is NOT Base64-encoded.")

if IsBase64("QUJD"):
    print("QUJD is Base64-encoded and its result after decoding is: " + str(base64.b64decode("QUJD")).replace("b'", "").replace("'", ""))
else:
    print("QUJD is NOT Base64-encoded.")

Сводка: IsBase64("string here") возвращает true , если string here имеет кодировку Base64, и возвращает false если string here НЕ был закодирован в Base64.

0 голосов
/ 07 июля 2016

Попробуйте это с помощью ранее упомянутого регулярного выражения:

String regex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
if("TXkgdGVzdCBzdHJpbmc/".matches(regex)){
    System.out.println("it's a Base64");
}

... Мы также можем сделать простую проверку, например, если у нее есть пробелы, она не может быть Base64:

String myString = "Hello World";
 if(myString.contains(" ")){
   System.out.println("Not B64");
 }else{
    System.out.println("Could be B64 encoded, since it has no spaces");
 }
0 голосов
/ 05 января 2016

Это работает в Python:

def is_base64(string):
    if len(string) % 4 == 0 and re.test('^[A-Za-z0-9+\/=]+\Z', string):
        return(True)
    else:
        return(False)
0 голосов
/ 20 декабря 2011

Нет способа различить строку и кодированный base64, за исключением того, что строка в вашей системе имеет определенные ограничения или идентификацию.

0 голосов
/ 05 ноября 2014

Если RegEx не работает, и вы знаете стиль форматирования исходной строки, вы можете изменить логику путем регулярного выражения для этого формата.

Например, я работаю с XML-файлами в кодировке Base64 и просто проверяюесли файл содержит допустимую разметку XML.Если это не так, я могу предположить, что это base64 декодируется.Это не очень динамично, но отлично работает для моего небольшого приложения.

0 голосов
/ 24 июля 2014

Этот фрагмент может быть полезен, если вы знаете длину исходного содержимого (например, контрольной суммы). Он проверяет, что закодированная форма имеет правильную длину.

public static boolean isValidBase64( final int initialLength, final String string ) {
  final int padding ;
  final String regexEnd ;
  switch( ( initialLength ) % 3 ) {
    case 1 :
      padding = 2 ;
      regexEnd = "==" ;
      break ;
    case 2 :
      padding = 1 ;
      regexEnd = "=" ;
      break ;
    default :
      padding = 0 ;
      regexEnd = "" ;
  }
  final int encodedLength = ( ( ( initialLength / 3 ) + ( padding > 0 ? 1 : 0 ) ) * 4 ) ;
  final String regex = "[a-zA-Z0-9/\\+]{" + ( encodedLength - padding ) + "}" + regexEnd ;
  return Pattern.compile( regex ).matcher( string ).matches() ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...