Я хочу декодировать строку в кодировке base64, а затем сохранить ее в своей базе данных. Если вход не кодируется в base64, мне нужно выдать ошибку. Как я могу проверить, была ли строка зашифрована в base64?
Как проверить, закодирована ли строка в base64 или нет
Ответ 1
Вы можете использовать следующее регулярное выражение, чтобы проверить, закодирована ли строка в base64:
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$
В кодировке base64 набор символов представляет собой [AZ, az, 0-9, and +/]
. Если длина покоя меньше 4, строка дополняется символами '='
.
^([A-Za-z0-9+/]{4})*
означает, что строка начинается с 0 или более групп base64.
([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}==
.
Ответ 2
Если вы используете Java, вы можете фактически использовать библиотеку commons-codec
import org.apache.commons.codec.binary.Base64;
String stringToBeChecked = "...";
boolean isBase64 = Base64.isArrayByteBase64(stringToBeChecked.getBytes());
Ответ 3
Ну, вы можете:
- Убедитесь, что длина кратна 4 символам.
- Убедитесь, что каждый символ находится в наборе A-Z, a-z, 0-9, +,/кроме заполнения в конце, который равен 0, 1 или 2 '=' символов
Если вы ожидаете, что это будет base64, то вы, вероятно, можете просто использовать любую библиотеку, доступную на вашей платформе, чтобы попытаться ее декодировать в массив байтов, выбрасывая исключение, если оно не является действительной базой 64. Это зависит от ваша платформа, конечно.
Ответ 4
Попробуйте это для 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";
}
Ответ 5
Начиная с Java 8, вы можете просто использовать java.util.Base64, чтобы попытаться декодировать строку:
String someString = "...";
Base64.Decoder decoder = Base64.getDecoder();
try {
decoder.decode(someString);
} catch(IllegalArgumentException iae) {
// That string wasn't valid.
}
Ответ 6
Есть много вариантов Base64, поэтому подумайте, просто ли ваша строка напоминает переменную, которую вы ожидаете обработать. Таким образом, вам может потребоваться отрегулировать регулярное выражение ниже по отношению к символам индекса и заполнения (т.е. +
, /
, =
).
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?
Ответ 7
Посмотрите, чтобы увидеть IF длина строки кратна 4. После этого используйте это регулярное выражение, чтобы убедиться, что все символы в строке являются символами base64.
\A[a-zA-Z\d\/+]+={,2}\z
Если библиотека, которую вы используете, добавляет новую строку как способ наблюдения за правилом 76 символов в строке, замените их на пустые строки.
Ответ 8
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');
}
Ответ 9
Попробуйте следующее:
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");
}
}
Ответ 10
С# Это отлично работает:
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;
}
Ответ 11
/^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/
это регулярное выражение помогло мне идентифицировать base64 в моем приложении в rails, у меня была только одна проблема, это то, что оно распознает строку "errorDescripcion", я генерирую ошибку, для решения которой просто проверяю длину строки.
Ответ 12
Невозможно проверить, закодирована ли строка в base64 или нет. Проверка возможна только в том случае, если эта строка имеет формат строки, закодированный в base64, что означает, что она может быть строкой, созданной кодировкой base64 (чтобы убедиться, что строка может быть проверена на соответствие регулярному выражению или может использоваться библиотека, многие другие ответы на этот вопрос предоставляют хорошие способы проверить это, поэтому я не буду вдаваться в подробности).
Например, flow
строки является допустимой строкой в кодировке base64. Но невозможно узнать, является ли это простая строка, flow
английских слов, или это строка с кодировкой base 64 ~Z0
Ответ 13
Нет никакого способа кодирования отдельной строки и base64, за исключением того, что строка в вашей системе имеет определенное ограничение или идентификацию.
Ответ 14
Этот фрагмент может быть полезен, когда вы знаете длину исходного содержимого (например, контрольную сумму). Он проверяет, что закодированная форма имеет правильную длину.
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() ;
}
Ответ 15
Если RegEx не работает, и вы знаете стиль форматирования исходной строки, вы можете отменить логику с помощью регулярного выражения для этого формата.
Например, я работаю с файлами x64, закодированными в base64, и просто проверяю, содержит ли файл действительную разметку xml. Если это не так, я могу предположить, что он base64 декодирован. Это не очень динамично, но отлично работает для моего небольшого приложения.
Ответ 16
Это работает в Python:
def is_base64(string):
if len(string) % 4 == 0 and re.test('^[A-Za-z0-9+\/=]+\Z', string):
return(True)
else:
return(False)
Ответ 17
Это работает в 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")
возвращает истину, если string here
закодирована в Base64, и возвращает ложь, если string here
НЕ была закодирована в Base64.
Ответ 18
Попробуйте это, используя ранее упомянутое регулярное выражение:
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 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");
}
Ответ 19
import org.apache.commons.codec.binary.Base64; ... Base64.isBase64 (строка)