2011-12-20 3 views
114

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

+0

Почему? Как может сложиться ситуация? – EJP

+1

без указания языка программирования (и/или) операционной системы, на которую вы нацеливаетесь, это очень открытый вопрос. – bcarroll

+3

Все, что вы можете определить, состоит в том, что строка содержит только символы, которые действительны для строки с кодировкой base64. Возможно, не удастся определить, что строка представляет собой кодированную версию base64 некоторых данных. например 'test1234' является допустимой строкой, закодированной base64, и когда вы ее декодируете, вы получите несколько байтов. Нет никакого независимого от приложения способа сделать вывод, что 'test1234' не является строкой, кодированной base64. –

ответ

147

Вы можете использовать следующее регулярное выражение, чтобы проверить, является ли строка в кодировке base64 или нет:

^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$ 

При кодировании base64, набор символов является [A-Z, a-z, 0-9, and + /]. Если длина остатка меньше 4, строка заполняется '=' символами.

^([A-Za-z0-9+/]{4})* означает, что строка начинается с 0 или более базовых 64 групп.

([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$ означает, что строка заканчивается в одной из трех форм: [A-Za-z0-9+/]{4}, [A-Za-z0-9+/]{3}= или [A-Za-z0-9+/]{2}==.

+5

Просто хотел проверить, пожалуйста, помогите с моим вопросом: Какова гарантия того, что это регулярное выражение всегда будет ссылаться только на строку base64? Если есть строка, у которой нет пробела, и она кратно четырем символам, то будет ли эта строка рассматриваться как base64 string ???? – DShah

+2

Затем это допустимая строка base64, которая может быть расшифрована. Вы можете добавить ограничение минимальной длины; например, вместо нуля или более повторений групп из четырех человек, требуется (скажем) четыре или более.Это также зависит от вашей проблемы; если ваши пользователи часто вводят одно слово на языке с длинными словами и чистым ASCII (гавайский?), он более подвержен ошибкам, чем если вход не-base64 обычно содержит пробелы, знаки препинания и т. д. – tripleee

+0

@Didier Ghys кажется, что эта закодированная строка base64 'IHRlc3QgbWVzc2FnZQoK' не много regex. Или, может быть, это не кодировка base64? хотя base64_decode ('IHRlc3QgbWVzc2FnZQoK') выводит строку записи - 'test message' – dav

35

Ну вы можете:

  • Убедитесь, что длина кратна 4-х символов
  • Убедитесь, что каждый символ находится в наборе AZ, AZ, 0-9, +,/для заполнения, кроме конец которой равно 0, 1 или 2 «=» символы

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

0

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

2

Есть много variants of Base64, поэтому рассмотрим только определение, соответствует ли ваша строка переменным, который вы ожидаете обработать. Таким образом, вам может потребоваться отрегулировать регулярное выражение ниже по отношению к символам индекса и заполнения (т. Е. +, /10, =).

class String 
    def resembles_base64? 
    self.length % 4 == 0 && self =~ /^[A-Za-z0-9+\/=]+\Z/ 
    end 
end 

Использование:

raise 'the string does not resemble Base64' unless my_string.resembles_base64? 
32

Если вы используете Java, вы можете использовать commons-codec библиотека

import org.apache.commons.codec.binary.Base64; 

String stringToBeChecked = "..."; 
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes()); 
+10

из документации: 'isArrayByteBase64 (byte [] arrayOctet)' Устаревший. 1.5 Используйте 'isBase64 (byte [])', будет удален в 2.0. –

+5

Вы можете также использовать Base64.isBase64 (String base64) вместо того, чтобы преобразовывать его в массив байтов самостоятельно. – Sasa

+5

К сожалению, на основе документации: http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html#isBase64%28java.lang.String%29: " Проверяет заданную строку, чтобы увидеть, содержит ли она только допустимые символы в алфавите Base64. В настоящее время метод рассматривает пробелы как действительные. " Это означает, что эти методы имеют некоторые ложные срабатывания, такие как «пробелы» или числа («0», «1»). –

4

Проверьте, чтобы увидеть IF длина струны кратно 4. Aftwerwards используют это регулярное выражение, чтобы убедиться, что все символы в строке являются символами base64.

\A[a-zA-Z\d\/+]+={,2}\z

Если библиотека используется добавляет символ новой строки, как способ наблюдения за 76 максимумы символов за правило линии, заменить их с пустыми строками.

+0

Указанная ссылка показывает 404. Пожалуйста, проверьте и обновите. – Ankur

+0

Извините @AnkurKumar, но это то, что происходит, когда у людей есть размытые URL-адреса: они меняются все время. Я понятия не имею, куда он переехал. Я надеюсь, что вы найдете другие полезные ресурсы через Google –

8

Попробуйте, как это для PHP5

//where $json is some data that can be base64 encoded 
$json=some_data; 

//this will check whether data is base64 encoded or not 
if (base64_decode($json, true) == true) 
{   
    echo "base64 encoded";   
} 
else 
{ 
    echo "not base64 encoded"; 
} 
+0

why -1. Его работа отлично подходит для меня –

+1

На каком языке это? Вопрос задавался без ссылки на язык – Ozkan

+0

@ Ozkan его в php5 –

0

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

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() ; 
} 
0

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

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

4
var base64Rejex = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i; 
var isBase64Valid = base64Rejex.test(base64Data); // base64Data is the base64 string 

if (isBase64Valid) { 
    // true if base64 formate 
    console.log('It is base64'); 
} else { 
    // false if not in base64 formate 
    console.log('it is not in base64'); 
} 
0

Попробуйте это:

public void checkForEncode(String string) { 
    String pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$"; 
    Pattern r = Pattern.compile(pattern); 
    Matcher m = r.matcher(string); 
    if (m.find()) { 
     System.out.println("true"); 
    } else { 
     System.out.println("false"); 
    } 
} 
+0

рассмотрите возможность предоставления объяснения вашему коду – arghtype

0

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

def is_base64(string): 
    if len(string) % 4 == 0 and re.test('^[A-Za-z0-9+\/=]+\Z', string): 
     return(True) 
    else: 
     return(False) 
3

На Java 8, вы можете просто использовать java.util.Base64, чтобы попытаться декодировать строку:

String someString = "..."; 
Base64.Decoder decoder = Base64.getDecoder(); 

try { 
    decoder.decode(someString); 
} catch(IllegalArgumentException iae) { 
    // That string wasn't valid. 
} 
+0

да, это вариант, но не забывайте, что улов довольно дорого работает в Java – panser

1

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

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

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"); 
} 
-1

import org.apache.commons.codec.binary.Base64; ... Base64.isBase64 (строка)

+1

В документе Java сказано что-то другое: «Проверяет заданную строку, чтобы увидеть, содержит ли она только допустимые символы в алфавите Base64 ». Таким образом, методы проверяют, содержит ли строка только допустимые символы Base64, но NOT, если строка была закодирована Base64! –

0

/^ ([A-Za-z0-9 + /] {4}) * ([A-Za-z0-9 + /] {4} | [A-Za-z0-9 + /] {3} = | [A-Za-z0-9 + /] {2} ==) $/

Это регулярное выражение помогло мне определить base64 в моей заявке в рельсах у меня была только одна проблема, это то, что она распознает строку «errorDescripcion», я генерирую ошибку, для ее решения просто проверяем длину строки.

Смежные вопросы