Autor Zpráva
pajadvorak
Profil
Mám tento kód a pracuji s PHP 5.2. Nevím jak mám správně zašifrovat a podepsat řetězec. Dole v kódu je generovaný PKP, který mi to píše, ale potřeboval bych z toho dostat "správný PKP" (též níže). Za jakoukoliv pomoc děkuji.

potřebuji SHA256withRSA

$cert_info = array(); 
if (! $cert_store = file_get_contents ( "certifikaty/01000003.p12" )) {
echo "Error: Unable to read the cert file<br />" ;
exit;
}

if ( openssl_pkcs12_read ( $cert_store , $cert_info , "eet" )) {
echo "Certificate Information<br />" ;
print_r ( $cert_info );
} else {
echo "Error: Unable to read the cert store.<br />" ;
exit;
} 

// řetězec, který chceme podepsat
$retezec = 'CZ1212121218|273|/5546/RO24|0/6460/ZQ42|2016-08-05T00:30:12+02:00|34113.00';
// podpis
$podpis = '';
// podpisový klíč - privátní
$pk = $cert_info['pkey'];
         
// funkce, která nám vytvoří podpis         
openssl_sign($retezec, $podpis, $pk, "SHA256");
$podpis = hash('SHA256',$podpis);
$podpis = base64_encode($podpis);


 
$binary_signature = ""; 
$algo = "SHA256"; 
openssl_sign($retezec, $binary_signature, $pk, $algo); 
print(base64_encode($binary_signature) ."\n");     


Generovaný PKP:
ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQ==



echo "Správný PKP:<br />";
echo "D84gY6RlfUi8dWdhL1zn0LE0s+aqLohtIxY0y88GoG5Ak8pBEH3/Ff2aFW7H6fvRxDMKsvM/VIYtUQxoDEctVGMSU/JDf9Vd0eQwgfLm683p316Sa4BUnVrIsHzwMyYkjpn66I072G2AvOUP4X5UiIYtHTwyMVyp+N/zzay3D7Q619ylDb6puN2iIlLsu+GNSB9DvsQbiLXPH6iK0R9FpR15v2y+0Uhh8NNJKl7O8Us9jbgokrA9gze+erQbhmwTm2nn2+7JGrPDqhyhwWZNLUziGSbC99wJpkEnIs0das/4hFNE3DnLvv4MsXwWCLOUZty6t6DAijlCzQj7KFKw0g==";
TomášK
Profil
Z toho popisu mi není jasné, proč jsou tam dva bloky s openssl_sign - jeden je špatně a druhý správně? Nebo tam ten jeden je jen navíc?

Momentálně vstup akorát zahashuješ a převádíš z jednoho kódování do druhého.
Vstup:
CZ1212121218|273|/5546/RO24|0/6460/ZQ42|2016-08-05T00:30:12+02:00|34113.00

SHA256 otisk vstupu, zapsaný hexadecimálně:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

SHA256 otisk vstupu, zapsaný hexadecimálně, a poté zakódovaný do base64:
ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQ

Neznám interface openssl natolik, abych ti i dokázal říct, co je špatně. Momentálně se ten privátní klíč vůbec nepoužije. Zkusil bych nahradit SHA256 za SHA256withRSA, ale přijde mi, že bude potřeba i něco dalšího.

Tip: kódovat hex text do base64 je skoro určitě vždy špatné, nejdřív je potřeba převést hex do binárního zápisu a ten pak teprv převést do base64.
pajadvorak
Profil
TomášK:
Jsou tam pro ukázku, že mi to nefunguje a ten druhý jak by to mělo vyjít... Každopádně problém je v tom, že PHP 5.2 to nezvládá... takže přesunu webu na PHP 5.4 a mělo by to být ok... :-)

Tak uvidíme...
Fisir
Profil
Reaguji na pajudvoraka:
Přesuň to na PHP 5.6, verze 5.4 je zastaralá, nepodporovaná a nebezpečná.
pcmanik
Profil
pajadvorak:
Keď už teda ideš aktualizovat rovno prejdi na PHP7 a ušetríš si ďalšie starosti do budúcna. V aktuálnom kóde by si nemal potrebovať žiadne zmeny resp. len minimum.
pajadvorak
Profil
Fisir:
Díky za tip. Ale toho se momentálně bojím... :-( jede nám na tom celý systém a vím, že když jsem to přesouval na PHP 5.5 byli s tím nějaké potíže a z důvodu nedostatku času se to vracelo opět zpět... Momentálně si nemohu dovolit větší výpadek...

A bohužel nemám po ruce někoho tak zkušeného, abychom to celé rozhrabali.. :-(


Fisir:
Tak jsem mluvil se svým kamarádem, co mi s tím bude pomáhat a budeme to přesouvat na PHP 5.5 (což je nejvyšší verze na dosavadním hostingu)... a uvidíme ;-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: