#c# #java #php #android #cryptography
#c# #java #php #Android #криптография
Вопрос:
Я работаю над проектом, который включает в себя чтение данных открытого ключа, используемых для подписи APK-файлов Android. Я могу успешно извлечь подписи в виде открытых ключей. Когда я заглядываю внутрь двоичных файлов pubkey, созданных этим, я вижу некоторый обычный текст, такой как имя и город.
Как я могу безопасно извлечь это имя / информацию о городе, встроенную в открытый ключ, используя PHP (или даже Java или C #)? И, надеюсь, сделайте это таким образом, чтобы я точно знал, что представляют собой эти поля (т. Е. не хватал текст вслепую, а знал, какая строка является городом, а какая — названием)
Для пояснения: у меня нет закрытого ключа или файла сертификата. В настоящее время я не заинтересован в подписывании или шифровании чего-либо, я просто хотел бы извлечь открытый текст внутри pubkey без использования сложных подходов, таких как regex.
Обновление: Вот образец (в кодировке base64) открытого ключа из одного из моих APK
MIICBzCCAXCgAwIBAgIES6KlazANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJVUzELMAkGA1UECBMCUkkxFTATBgNVBAcTDE5hcnJhZ2Fuc2V0dDEVMBMGA1UEAxMMQ29saW4gTydEZWxsMB4XDTEwMDMxODIyMTI1OVoXDTQ1MDMwOTIyMTI1OVowSDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlJJMRUwEwYDVQQHEwxOYXJyYWdhbnNldHQxFTATBgNVBAMTDENvbGluIE8nRGVsbDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmPetcBW ITURXY0LsI2ZfgM3R7K2kwicgpd0W BYAXQBh76SXyN9MYvtfnUY3SNz37FW/lDQgAO3pbhEFqGwfADh2ctXlYmlE9DtcRQw0ojGVPIDlWBX 9IUxyL/89CPaN84R/1lvdosco4V0BqQYR300S9ZwmwFA2Vh9hSUZmsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBezKu4G11Z68NTPIBro8xsnbkdYxObzW7BsSr6t9MS5x6EQVs75R/nnKrsMcQ 9ImdT940jhQgZT3ZrYla5VhdbelxnLhBVbJfBdipV3Hv2bG7MnXzFqHYwQqYp UrP8zWm1YHQf5I/P9VBjlkgwFyNKr0TxP4t/qS08oGX2wvZg==
Комментарии:
1. Можете ли вы опубликовать пример «двоичных файлов pubkey, созданных этим»? Используйте кодировку Base-64, чтобы преобразовать ее в текст с возможностью публикации.
2. @FlyingStreudel — Регулярное выражение, безусловно, может быть полезным во многих сценариях, но я не думаю, что оно подходит для этой задачи: P
3. @erickson — Сообщение было обновлено. Я использовал этот сайт, чтобы преобразовать это в двоичный файл: motobit.com/util/base64-decoder-encoder.asp
4. Вы на 100% уверены, что хотите сказать, что данные имени / города «встроены в открытый ключ»? Держу пари, что на самом деле вам нужен сертификат X509, который содержит как ключ, так и метаданные.
5. Колин, для меня это выглядит как полный сертификат x509. Вставьте базовую строку 64 в: redkestrel.co.uk/cgi/decodeCert.cgi
Ответ №1:
Введенная вами строка представляет собой сертификат x509 в кодировке base 64, а не просто открытый ключ.
Вам нужно проанализировать поля с различающимися именами, чтобы получить желаемую информацию.
Вот пример C #:
using System;
using System.Security.Cryptography.X509Certificates;
namespace Sample
{
class Program
{
static void Main(string[] args)
{
string base64EncodedX509 =
"MIICBzCCAXCgAwIBAgIES6KlazANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJVUzELMAkGA1UECBMCUkkxFTATBgNVBAcTDE5hcnJhZ2Fuc2V0dDEVMBMGA1UEAxMMQ29saW4gTydEZWxsMB4XDTEwMDMxODIyMTI1OVoXDTQ1MDMwOTIyMTI1OVowSDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlJJMRUwEwYDVQQHEwxOYXJyYWdhbnNldHQxFTATBgNVBAMTDENvbGluIE8nRGVsbDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmPetcBW ITURXY0LsI2ZfgM3R7K2kwicgpd0W BYAXQBh76SXyN9MYvtfnUY3SNz37FW/lDQgAO3pbhEFqGwfADh2ctXlYmlE9DtcRQw0ojGVPIDlWBX 9IUxyL/89CPaN84R/1lvdosco4V0BqQYR300S9ZwmwFA2Vh9hSUZmsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBezKu4G11Z68NTPIBro8xsnbkdYxObzW7BsSr6t9MS5x6EQVs75R/nnKrsMcQ 9ImdT940jhQgZT3ZrYla5VhdbelxnLhBVbJfBdipV3Hv2bG7MnXzFqHYwQqYp UrP8zWm1YHQf5I/P9VBjlkgwFyNKr0TxP4t/qS08oGX2wvZg==";
var rawBytes = Convert.FromBase64String(base64EncodedX509);
X509Certificate cert = new X509Certificate(rawBytes);
// Parse the distinguished name to get your desired fields
Console.WriteLine(cert.Subject); // writes CN=Colin O'Dell, L=Narragansett, S=RI, C=US
Console.WriteLine(cert.Issuer); // writes CN=Colin O'Dell, L=Narragansett, S=RI, C=US
}
}
}
Комментарии:
1. Это идеально 🙂 После того, как мне сообщили, что у меня фактически есть сертификат, я придумал аналогичное PHP-решение для сброса данных с помощью
$dataAsArray = openssl_x509_parse(openssl_x509_read($pemFormattedCertString));
Ответ №2:
«Двоичные файлы открытого ключа, созданные этим», являются сертификатом X.509.
Практически любая платформа поддерживает чтение сертификатов X.509 и создание из них структуры, из которой вы можете надежно извлечь «имя субъекта» и часто расширенную информацию, включающую адрес электронной почты или имя хоста.
Например, если у вас установлен OpenSSL, используйте следующую команду:
openssl x509 -text -noout -inform der -in <yourfilehere>
Вы можете извлекать определенные поля с дополнительными опциями. Например, добавление -subject
дает:
subject = /C = US/ST = RI/L = Наррагансетт / CN = Колин О’Делл
Ответ №3:
В php я не уверен, но, возможно, эта функция могла бы стать вашим другом. Существует целый раздел функций, связанных с ssl, которые могут пригодиться, если вы играете с сертификатами.
Комментарии:
1. Возможно, но у меня есть только открытый ключ, а не полный сертификат. Я просмотрел этот список функций ранее, но не смог найти ничего, что конкретно требовало бы моего внимания. Возможно, я что-то пропустил?