Diskuze: SHA256withRSA

PHP PHP SHA256withRSA American English version English version

Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Potřebuji řetězec podepsat algoritmem SHA256withRSA. Myslel jem, že se jedná prostě o jednu funkci jako například u hashe (md5 a pod). Ale asi to tak není nemůžu ani pořádně nic najít. Mohl by mi to tedy prosím někdo objasnit.

 
Odpovědět 17. srpna 12:17
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Ještě doplním, že jde tedy o funkci v javě ale potřebuji nějakou alternativu pro PHP.

 
Nahoru Odpovědět 17. srpna 13:15
Avatar
doMík
Člen
Avatar
doMík:

Nejsem javista, ale po nahlédnutí dokumentace mi to připomíná php funkci opensll_sign()

$retezec = 'tvuj retezec';
$podpis = '';
$pk = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
// ...
-----END RSA PRIVATE KEY-----
EOD;

openssl_sign($retezec, $podpis, $pk, "SHA256");

//v $podpis by nyní měl být podpis v binární formě.
//pro obvyklý výstup je potřeba ještě převést
$output = base64_encode($podpis);

nešla by použít? případně koukni ještě do dokumentace PHP tam toho bude určitě víc :)

 
Nahoru Odpovědět  +1 18. srpna 20:27
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na doMík
Maxy_obr:

Díky to vypadá, že bude ono. Ale pracuji s certifikátama a podpisama poprvé a nejsem z toho úplně moudrej. Mám k tomu tento zip se souborama a nejsem si jistej kterez z nich a jak použít. (jsou jen testovací :-) ) Mám tedy otevřít soubor ca.cer jeho obsah použít jako podpis a nebo certifikát v souboru cer.pem? A $pk (doufam ze myslis private key :D ) je tedy v souboru crl.pem? a jako poslední parametr uvádíš SHA256 ale ve specifikaci je can be one of OPENSSL_PKCS1_PAD­DING, OPENSSL_SSLV23_P­ADDING, OPENSSL_PKCS1_O­AEP_PADDING, OPENSSL_NO_PADDING.
Možná to píšu celé blbě tak prosím o vysvětlení a opravu. Hodně mi to pomůže :-)

 
Nahoru Odpovědět 19. srpna 10:09
Avatar
doMík
Člen
Avatar
doMík:

Private key by měl jít vytáhnout z souborů .pem ovšem jestli do těch tvých dobře koukam obsahuje pouze klíč veřejný..

Ano $pk je private key.

Ten poslední parametr "SHA256" tam musí být pokud to chceš mít SHA256 :D nejsemsi jistý co všechno se s tím dá ještě dělat jiného a jinak, ale tohle je vyzkousene že funguje :)

 
Nahoru Odpovědět 19. srpna 13:00
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na doMík
Maxy_obr:

Pochopil jsem tedy správně, že podpis to dole mezi -----BEGIN CERTIFICATE----- a -----END CERTIFICATE-----
pokud tu funkci použiju vypíše chybu openssl_sign() expects parameter 4 to be long tedy chybu 4. parametru ale je to divný tam asi chyba nebude, stejnou hlásí i pokud tam dám něco podle specifikace PHP, pokud ten parametr odstaním úplně chyba je supplied key param cannot be coerced into a private key. POkud tam tedy dávám správně podpis měl bych si asi prověřit ten pk co :D

 
Nahoru Odpovědět 19. srpna 13:48
Avatar
doMík
Člen
Avatar
doMík:

To je certifikát samotný. Kousek nad tím máš public key a private key který potřebuješ tam nevidím.

Tak to nevím pokud to zapíšu takto

<?php
$retezec = 'tvuj retezec';
$podpis = '';
$pk = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIBOQIBAAJBAMPrNeoR+OvJIDtCr8mSWXmr0SllhyeBD+qOqOeUcf1akGDOWdYJ
Wk2p92JtMM2RWVcV8+3UHxa/GsuD9f2y970CAwEAAQJAXQZ77Q5nkR1Irpq1eRKC
ZaFNiUhp6jn/4rGmRX9YuKDJKtuL5eEfzUL4NWbbYwe+oIfn6IQ7F2pC+66ygP+I
yQIhAOFNIwM32G1+6C6w+qXXE6ynOheroNwVgFOT9SQx6eC/AiEA3p0qUfuW1zN2
ZfxNVcDPb1ApMC82NcutjmuFSpmiioMCIHojHv/3nlR9n9DwEHEnD3thjJSYbjPh
VBf69cIRbQBxAiBdnydvNynm84O1vHghumcC32mTFCfuU+x32wxBpX9QVQIgBewC
ekhKtep8NFvelVEOgJMbymg+AlbYdY/cB+Da2g4=
-----END RSA PRIVATE KEY-----
EOD;

openssl_sign($retezec, $podpis, $pk, "SHA256");

echo base64_encode($podpis);

funguje to bez problémů a vypíše podpis "vJYfk6WSEqtDSZ9Gcfok­gpQPgJ0o4hlQD5AD­TC83psRPCHFEL­Zn9Bl65f8eEIaJ­luGfw91KzhgOD­piE5nRLIjg=="
Max jestli se funkčnost neliší verzí PHP...

(použitý klíč je náhodný RSA private key vygenerovaný prvním online generátorem který mi přišel pod ruku)

 
Nahoru Odpovědět  +1 19. srpna 14:43
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Takže raději pro jistotu. $podpis je v souboru ca.cer.pem a konkrétně

00:cd:8d:c9:1­c:79:aa:2c:14:88:c­b:b1:2f:24:36:
27:dd:07:d7:9­5:da:9f:fb:2e:37:46:6c:c­1:28:af:
41:13:a2:97:1­a:f6:20:9b:25:f8:f0:27:8­7:37:4d:
18:c5:c8:cb:e­5:ee:9b:54:45:c­0:79:76:02:b1:b0:
e5:18:d5:c2:f­1:83:59:32:10:a­e:34:5d:39:cb:cc:
81:ec:7c:93:a­8:85:58:93:18:e­e:b3:12:b7:95:3a:
7e:44:20:88:5­d:15:e1:3f:42:bc:2c:e7:3­a:03:93:
db:51:b3:d4:6­6:14:d1:81:e4:e6:77:82:b­c:e4:db:
a5:6f:b0:36:7­7:4e:f3:8b:f7:c7:3c:a2:8­7:4e:bb:
a1:2e:30:4d:6­3:ad:c2:4d:a0:5b:a1:9f:8­6:3a:51:
a3:bc:7b:bc:f­5:ce:a9:f3:10:82:89:68:d­2:36:8e:
9d:6a:0b:22:5­b:50:a1:17:86:21:30:8d:8­1:fe:1e:
80:98:e2:8f:a­d:bb:93:16:2b:c8:58:4e:6­1:b9:4e:
ca:ac:95:84:e­d:ef:4b:b2:04:6f:e8:89:d­a:85:9e:
7e:68:44:36:0­4:4b:e0:f7:b4:44:b2:65:a­4:87:e8:
49:87:13:68:8­1:ed:f8:5c:47:41:a3:0b:8­6:6b:21:
c0:98:21:e2:1­c:e3:8c:0c:27:1e:3e:d3:8­c:b4:a5:
09:b9

Co se týče toho posledního parametru, vážně vždycky vyhodí chybu co jsem psal. Pokud ho odstaním funkce funguje. Nedalo by se to jednoduše vyřešit takto?
openssl_sign($re­tezec, $podpis, $pk);
$podpis = hash('sha256'­,$podpis)
$podpis = base64_encode($pod­pis);

Editováno 22. srpna 10:23
 
Nahoru Odpovědět 22. srpna 10:23
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na doMík
Maxy_obr:

Obecně je nutné aby se RSA klíč přiřazoval přímo nebo na něm nezáleží a můžu si vygenerovat jaký chci. Jediné co jsem dohledal je, že by měl mít 2048 bit.

 
Nahoru Odpovědět 22. srpna 10:31
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na Maxy_obr
Maxy_obr:

Jo a s tím SHA256 je to opravdu verzí PHP
These constants were added in 5.4.8.
OPENSSL_ALGO_RMD160, OPENSSL_ALGO_SHA224, OPENSSL_ALGO_SHA256, OPENSSL_ALGO_SHA384, OPENSSL_ALGO_SHA512

 
Nahoru Odpovědět 22. srpna 12:44
Avatar
doMík
Člen
Avatar
doMík:

V případě, že chceš podepsat svůj řetězec podpis tvého souboru tě nemusí moc zajímat protože potřebuješ udělat podpis nový pro ten řetězec takže $podpis na začátku necháš prázdný a potom si z něj přečteš hotový podpis pro tvůj řetězec. :)

udělal sem malý experiment poslední parametr "SHA256" způsobuje problém u verzí PHP nižších než PHP 5.2 pokud požíváš PHP nižší než 5.2 tak pokud nemáš vážný důvod pro zachování této verze uděláš nejlíp když si ho aktualizuješ momentálně je nejnovější PHP 7,ale pokud necheš zas tak velký skok tak asi PHP 5.4 nebo PHP 5.6 to sou docela dobré verze. (o zpětnou kompatibilitu se nemusíš bát ta je téměř 100% a málo kdy na nějaký problém narazíš. třeba v PHP 7 třeba už nefungují ovladače databáze mysql_* ale ty už by se dávno neměli používat a tak. nové verze zrychlují a přidávají novou funkčnost).
co se tvého řešení týče

openssl_sign($retezec, $podpis, $pk);
 //ano skutečně funguje vyhodí ti binární podpis, ale v jaké podobě sem nenašel (možná sha1)

$podpis = hash('sha256',$podpis)
//tímto vytvoříš nedefinovatelný sha256, který má ale uplně jinou hodnotu než při použití parametru "SHA256"

$podpis = base64_encode($podpis);
//tato funkce je použitá pro převod z binárního řetězce na textový, funkce hash() už textový řetězec vrací..

Ne není nutné přiřazovat klíč. Pomocí funkce openssl_pkey_new() si můžeš na základě zadaných parametrů vygenerovat dvojici Private_KEY a Public_KEY kdykoliv potřebuješ.
může mít hodnoty 512(málo), 1024(slabší standart), 2048 a 4096.
Pokud si budeš takhle generovat nové klíče, všechny ostatní soubory pak nebudeš potřebovat. ovšem je otázka jestli to nebude vadit? Protože tvůj certifikát je ověřován a podepsán důvěryhodnou autoritou jejíž certifikát má uživatel někde nainstalovaný čímž uživateluv PC ověří pravost tvého cerifikátu a pomocí Public key který je v tvém certifikátu, který si nainstaluje ověřuje pravost tvých podpisů u souborů co mu posíláš. (jestli to nějak pochopitelně vysvětluji)
A nebo bez certifikátů musíš uživateli nějak doručit i tvůj Pubilc key protože tvůj podpis je moc hezký ale pokud nemá uživatel jak ověřit jeho pravost je celkem k ničemu.(tohle druhé je např. ten případ když si to budeš gerovat sám) :)

 
Nahoru Odpovědět 22. srpna 13:01
Avatar
doMík
Člen
Avatar
Odpovídá na Maxy_obr
doMík:

:D než sem to všechno ozkoušel a sepsal už si si to našel sám koukám :D

 
Nahoru Odpovědět 22. srpna 13:02
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na doMík
Maxy_obr:

Verzi PHP bych neřešil je to komplikovanější. :D Přesunul jsem to na localhost. Pokud se parametr nevyplní opravdu to defaultně doplní sha1. Koukám, že jsem tu funkci chápal špatně. Vkládám tedy řetězec který chci podepsat, prázdnou proměnou do které se mi podpis vloží, private key (který si vygeneruji), a algoritmus. Ověřovat pravost právě musím. Proto sem z toho teď zmatenej. Jak dochází k tomu ověření, kam zmizely všechny certifikáty když nic z toho nepoužívám? :D
Edit: Private key mu posílám společně s ostatními údaji.

Editováno 22. srpna 13:34
 
Nahoru Odpovědět 22. srpna 13:31
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na Maxy_obr
Maxy_obr:

Jinak sem docela otravnej takže pokud by si věděl o nějakém českém zdroji kde to můžu nastudovat tak mi ho prosím pošli. Já nic kloudnýho nenašel.

 
Nahoru Odpovědět 22. srpna 14:45
Avatar
doMík
Člen
Avatar
Odpovídá na Maxy_obr
doMík:

Psal sem pokud je to možné :D

Ano přesně tak funguje. :)

Certifikát by ti byl dobrý pokud by obsahoval i private key ale ty máš "veřejný" certifikát který se dává uživatelům a skrz něj ověřují pravost tvých podpisů atd. :D a ano je možnost je opravdu vypustit a fungovat i bez něj. akorát je potřeba dávat trochu víc pozor aby vřejný klíč který nějakým způsobem předáváš uživateli nikdo nepodvrhl.
!! Private key nikomu nedávaš ten si schováš někam tajně !!

Napíšu ti jednoduchý příklad, na ověření předpokládejme, že jak klient tak server jsou v PHP a používáš certifikát (princip je většinou dost podobný všude)

<?php  /* klient */
//načtení dat ze serveru
$url = "http://www.tvujserver.com/rozhrani.php";
$url =  urlencode($url);
$nacteni = file_get_contents($url)
$data = json_decode($nacteni);

//přiřazení hodnot
$podepsanytext = $data->{'data'};
$podpis = $data->{'signature'};

//Načtení veřejného klíče z lokálně uloženého certifikátu (tohle mužeš použit to tvůj certifikát obsahuje)
$pub_key_id = openssl_pkey_get_public("file://path/to/file/ca.cer.pem");

//ověření pravosti
$ok = openssl_verify($podepsanytext, $podpis, $pub_key_id);

if($ok = 1)  { echo ("Podpis je v pořádku"); }
else if ($ok = 0)  { echo ("Podpis neodpovídá textu, pravděpodobně se jedná o podvržená data"); }
else { echo ("ověření pravsti selhalo"); }
<?php /* server */
$retezec;
//some code... & set value $retezec

$podpis = '';
$pk = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
// RSA PRIVATE KEY který musí být dvojicí s veřejným klíčem který má u sebe klient - je možné ho i načítat ze souboru ale na to máš špatné soubory
-----END RSA PRIVATE KEY-----
EOD;

openssl_sign($retezec, $podpis, $pk, "SHA256");

$output = array (
    'data' => $retezec,
    'signature' => base64_encode($podpis)
);

$json = json_encode($output);
echo $json;

:)
ono s těmi certifikáty je to bezpečnější :) a snad je to nějak srozumitelně napsané :D

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 22. srpna 15:15
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na doMík
Maxy_obr:

Díky moc, řekněme, že už to tak nějak chápu. :D Narazil jsem ještě na jednu věc v dokumentaci.

Certifikát i s privátním klíčem je publikován ve formátu PKCS#12/PFX, heslo 'eet', soubor
01000004.p12

Pracoval jsi někdy s tímto formátem? Jak z toho ty údaje mám dostat? :)

 
Nahoru Odpovědět 23. srpna 11:35
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na Maxy_obr
Maxy_obr:

Tak jo pomocí funkce openssl_pkcs12_r­ead() dostanu ze souborů .p12 jak PK tak certifikát. Tím se dostáváme zas o kus dál :D

 
Nahoru Odpovědět 24. srpna 13:21
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na doMík
Maxy_obr:

Díky moc, tohle téma je vyřešený. Ještě bych ale doplnil jednu věc co mi není jasná. Mám teď z podpisu udělat hash sha1.
Dekóduju si tedy zpět - $podpis = base64_decode($pod­pis)
zaheshuju - $podpis = sha1($podpis)
a následně mám $podpis hexadecimálně zakódovat, na to jsem si našel funkci chunk_split($pod­pis,aktuální kódování,16) Problém mám v tom, že nevím co zadat do druhého parametru. Jak zjistím jaké mám aktuální kódování? Nebo jaké má kódování řetězec po zaheshování sha1.

 
Nahoru Odpovědět 24. srpna 14:45
Avatar
doMík
Člen
Avatar
Odpovídá na Maxy_obr
doMík:

Promin za kratší odpověď sem na telefonu aktuální kódování zpravidla odpovídá kódování souboru php, vhodným řešením je pomocí funkce mb_internal_en­coding() nastavit kódování pro používané interní "stringy" a pak budeš mít jistotu jaké kódování se uvnitř používá takže i jaké nastavit do této funkce :)

 
Nahoru Odpovědět 24. srpna 17:04
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na doMík
Maxy_obr:

Tohle je další věc v které mám trochu zmatek ale nejsou to 2 různé věci? Možná jsem to neměl pojmenovat jako kódování ale soustava. Potřebuji převést řetězec do 16kové soustavy a k tomu potřebuji znát aktuální soustavu.

Editováno 25. srpna 10:33
 
Nahoru Odpovědět 25. srpna 10:32
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na Maxy_obr
Maxy_obr:

Tak ten samotnej hash SHA1 je v 16kové soustavě.

 
Nahoru Odpovědět 25. srpna 13:48
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na doMík
Maxy_obr:

Podařilo se mi to tak nějak dát dohromady. Momentálně volám SOAP funkci která mi vrací odpověď. Ale vypisuji to pouze takto:

$result = $client->OdeslaniTrzby($param);
print_r($result);

Asi to není úplně správné řešení, nemá se například volat nějaká funkce která se při odpovědi vrací?
Podle specifikace by se měla odpověď vracet jako XML. Pokud je to tak jak si myslím, jak zjistím kterou funkci vrací. Pokud je to jinak tak prosím o vysvětlení.
Díky :-)

 
Nahoru Odpovědět 14. září 9:54
Avatar
ja13
Člen
Avatar
ja13:

Ahoj Maxy_obr :-)

taky začínám řešit stejný problém. Potřebuji si na svém eshopu zprovoznit záležitosti kolem eet. Nejsem úplně zběhlý v tom, co po nás chtějí s těmi certifikáty a šifrováním... :-)

Mohu Tě poprosit o nějaký funkční kód, který bych mohl použít?
Děkuji.

 
Nahoru Odpovědět 21. září 14:26
Avatar
ja13
Člen
Avatar
ja13:

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==";
 
Nahoru Odpovědět 21. září 20:03
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na ja13
Maxy_obr:

Ahoj, nemám teď moc čas se na to kouknout. Ale zarazila mě jedna věc. Tobě funguje funkce openssl_sign s parametrem SHA256 na php 5.2? Podle specifikace by to mělo být až od verze 5.4 viz http://php.net/…re-algos.php

 
Nahoru Odpovědět 21. září 21:27
Avatar
ja13
Člen
Avatar
Odpovídá na Maxy_obr
ja13:

No právě, že nefunguje... :-(

Mám tam pod tím tohle:

$podpis = hash('SHA256',$podpis);

Obávám se toho, že budu muset celý systém předělat na PHP 5.4, z čehož úplně nejásám... :-(

A hledám řešení pro PHP 5.2

Chápu, že nemáš čas, ale pokud by sis cokoliv vyšetřil, moc by mi to pomohlo... :-)
Děkuji

 
Nahoru Odpovědět 21. září 21:39
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Tohle jsem ale nevyřešil pouze jsem přešel na vyšší PHP. Tuhle funkci bez toho nerozjedeš a o náhradním řešení nevím.

 
Nahoru Odpovědět 21. září 22:04
Avatar
ja13
Člen
Avatar
Odpovídá na Maxy_obr
ja13:

Tušil jsem, že mi to řekneš :-D no nic... už dávám dohromady přesun na PHP 5.4.. :-)

ty jsi asi také přecházel z PHP 5.2 nebo tak něco.... máš nějaké informace, na co si eventuálně dát pozor? nějaké háčky a tak... ;-)
děkuji

 
Nahoru Odpovědět 21. září 22:46
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Nepřecházel :-) já to jen psal na serveru kde je 5.2 a nainstaloval jsem si localhost protože to stejně poběží úplně jinde

 
Nahoru Odpovědět 21. září 22:50
Avatar
ja13
Člen
Avatar
ja13:

Aaaha :-D no, trochu jiná situace, ale závěr je takový, že musíme přesunout web na vyšší PHP.... předpokládám, že když to bude PHP 5.4, že už mě nic špatného ve věci EET nepotká.... :-) nebo ano?

 
Nahoru Odpovědět 21. září 22:57
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

No nevím sám to ještě nemám hotové :D

 
Nahoru Odpovědět 21. září 23:00
Avatar
ja13
Člen
Avatar
Odpovídá na Maxy_obr
ja13:

Chápu :-)

doufám, že to nebudu muset posouvat na ještě vyšší PHP :-D ;-)

čas ukáže.. v pátek večer to budu zřejmě přesouvat a pak se pustím do dalšího...

to eet děláš pro sebe nebo pro někoho?

 
Nahoru Odpovědět 22. září 13:11
Avatar
Honza Šustr
Člen
Avatar
Honza Šustr:

Ahoj všichni,
upravil jsem Váš kód

// funkce, která nám vytvoří podpis
openssl_sign($retezec, $podpis, $pk, "SHA256");
//    >>>>>    $podpis = hash('SHA256',$podpis);
$podpis = base64_encode($podpis);

a dostal jsem se k PKP na konci zdrojáku.
"D84gY6R....zQj7KFKw0g==
ale jestli je opravdu ten správný....
moje PHP je 5.4.6

 
Nahoru Odpovědět  +1 23. září 0:07
Avatar
Honza Šustr
Člen
Avatar
Honza Šustr:

Ahoj, doplnil jsem kód od výpočet BKP.
Ještě kdyby to šlo to šifrování vymyslet v delphi...
díky za nakopnutí.

<?php
$cert_info = array();
if (! $cert_store = file_get_contents ( "C:\_F\Programes\_XE8_FMX\TestKryptovani/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'];

//**print_r ($pk);
//echo hash('SHA256',$retezec);
//$retezec = hash('SHA256',$retezec);

// funkce, která nám vytvoří podpis
openssl_sign($retezec, $rsa_text, $pk,OPENSSL_ALGO_SHA256);  // "SHA256");

echo '1.  po openssl_sign<br>';
echo $rsa_text.'<br>';

$rsa_text_base64 = base64_encode($rsa_text);

echo '2. po base64_encode  = PKP <br>';
echo $rsa_text_base64.'<br>';

$hash_sha1_base16 = sha1($rsa_text);
//$hash_sha1_base16 =  hash('SHA1',$rsa_text);  //stejný výsledek

echo '3. po SHA1  <br>';
echo $hash_sha1_base16.'<br>';

$hash_sha1_base16 =  chunk_split($hash_sha1_base16,8);

echo '4. po pomlčkách  = BKP <br>';
echo $hash_sha1_base16.'<br>';

?>

výsledky odpovídají vzorové zprávě
zatím

 
Nahoru Odpovědět 23. září 9:44
Avatar
ja13
Člen
Avatar
Odpovídá na Honza Šustr
ja13:

Ahoj Honzo :-)

skvělý, že ses přidal... půjde nám to určitě lépe :-)
já jsem právě zjistil, že celý problém proč mi to nejde je v tom, že mám PHP 5.2 a to neumí SHA256..

Takže dneska večer přecházím na PHP 5.4 a doufám, že už pak bude vše ok... jen doufám, že nebudu muset moc věcí opravovat.... :-( uvidíme... :-)

Další věc pak bude sestavit hlavičku a SOAP obálku... ;-)

kdyby jsi něco měl, budu rád, když to poskytneš, abychom mohli pokročit (ale k tomu jsem se ještě nedostal..)
Díky moc za tvůj příspěvek!

 
Nahoru Odpovědět 23. září 15:31
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Jo podepsaná SOAP header je to co bych taky potřeboval :-) Ale nemůžu pořádně ani nikde najít jak by se mělo postupovat.

 
Nahoru Odpovědět 23. září 17:32
Avatar
ja13
Člen
Avatar
ja13:

Ahoj všichni :-)

tak včera jsme přemigrovali na PHP 5.5 ;-) tento víkend bude asi pracovní :-D

každopádně, funkce hash začala fungovat a zde je můj kód:

$cert_info = array();
//if (! $cert_store = file_get_contents ( "C:\_F\Programes\_XE8_FMX\TestKryptovani/01000003.p12" )) {
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;
}


echo "<br><br>";
echo "<br><br>";
echo "<br><br>";


// ř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, OPENSSL_ALGO_SHA256);
$podpis = base64_encode($podpis);






echo "Generovaný PKP:<br />";
echo $podpis;

echo "<br><br>";
echo strlen($podpis);
echo " / správné číslo je 344 znaků";

echo "<br><br>";
echo "<br><br>";
echo "<br><br>";


echo "Správný PKP:<br />";
echo "D84gY6RlfUi8dWdhL1zn0LE0s+aqLohtIxY0y88GoG5Ak8pBEH3/Ff2aFW7H6fvRxDMKsvM/VIYtUQxoDEctVGMSU/JDf9Vd0eQwgfLm683p316Sa4BUnVrIsHzwMyYkjpn66I072G2AvOUP4X5UiIYtHTwyMVyp+N/zzay3D7Q619ylDb6puN2iIlLsu+GNSB9DvsQbiLXPH6iK0R9FpR15v2y+0Uhh8NNJKl7O8Us9jbgokrA9gze+erQbhmwTm2nn2+7JGrPDqhyhwWZNLUziGSbC99wJpkEnIs0das/4hFNE3DnLvv4MsXwWCLOUZty6t6DAijlCzQj7KFKw0g==";

echo "<br><br>";
echo strlen("D84gY6RlfUi8dWdhL1zn0LE0s+aqLohtIxY0y88GoG5Ak8pBEH3/Ff2aFW7H6fvRxDMKsvM/VIYtUQxoDEctVGMSU/JDf9Vd0eQwgfLm683p316Sa4BUnVrIsHzwMyYkjpn66I072G2AvOUP4X5UiIYtHTwyMVyp+N/zzay3D7Q619ylDb6puN2iIlLsu+GNSB9DvsQbiLXPH6iK0R9FpR15v2y+0Uhh8NNJKl7O8Us9jbgokrA9gze+erQbhmwTm2nn2+7JGrPDqhyhwWZNLUziGSbC99wJpkEnIs0das/4hFNE3DnLvv4MsXwWCLOUZty6t6DAijlCzQj7KFKw0g==");
echo " / správné číslo je 344 znaků";




echo "<br><br>";

$rsa_text = $podpis;

echo '1.  po openssl_sign<br>';
echo $rsa_text.'<br>';

$rsa_text_base64 = base64_encode($rsa_text);

echo '2. po base64_encode  = PKP <br>';
echo $rsa_text_base64.'<br>';

$hash_sha1_base16 = sha1($rsa_text);
//$hash_sha1_base16 =  hash('SHA1',$rsa_text);  //stejný výsledek

echo '3. po SHA1  <br>';
echo $hash_sha1_base16.'<br>';

$hash_sha1_base16 =  chunk_split($hash_sha1_base16,8);

echo '4. po pomlčkách  = BKP <br>';
echo $hash_sha1_base16.'<br>';


echo "<br><br> správně:<br> 8F8ABFEB-B76E7064-343A1460-6C6E6D86-B0F99C24 <br><br>";

$podpis = strtoupper(chunk_split(sha1(base64_decode($podpis)),8,"-"));

echo $podpis;
 
Nahoru Odpovědět 24. září 10:21
Avatar
ja13
Člen
Avatar
Odpovídá na Honza Šustr
ja13:

Honzo, co jsem zkoušel ten BKP dle tvého vzoru, tak to vycházelo jinak než je ve vzorové zprávě...

můj by měl být v pořádku i s pomlčkami... :-)

 
Nahoru Odpovědět 24. září 10:22
Avatar
Honza Šustr
Člen
Avatar
Honza Šustr:

Ahoj,
jasné nedal jsem tam pomlčky, a pak velikost "hexa písmenek", v manuálu ale není ani zmínka zda mají být malá nebo velká. Ale vzor je vzor...

 
Nahoru Odpovědět 24. září 15:19
Avatar
ja13
Člen
Avatar
Odpovídá na Honza Šustr
ja13:

Ahoj Honzo,

tobě to BKP vyšlo 8F8ABFEB-B76E7064-343A1460-6C6E6D86-B0F99C24?

 
Nahoru Odpovědět 24. září 22:35
Avatar
ja13
Člen
Avatar
ja13:

Vypadá to, že se již migrace na PHP 5.5 a s tím spojené opravy blíží ke konci... :-)

Pracujete již někdo na hlavičce a obálce?

 
Nahoru Odpovědět 24. září 22:36
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na ja13
Maxy_obr:

Zatím ne a nějakou dobu se k tomu nedostanu.

 
Nahoru Odpovědět 27. září 10:46
Avatar
ja13
Člen
Avatar
Odpovídá na Honza Šustr
ja13:

Co ty Honzo, nějak jsi pokročil s hlavičkou či obálkou?

 
Nahoru Odpovědět 27. září 14:17
Avatar
ja13
Člen
Avatar
ja13:

Rozumíte někdo prosím jak správně definovat tuto třídu - xmlseclibs, aby správně podepsala XML soubor pro eet?

 
Nahoru Odpovědět 4. října 18:33
Avatar
ja13
Člen
Avatar
ja13:

Marně se snažím rozchodit SOAP request, který by mi vrátil XML včetně hlavičky. Nedaří se mi. Prosím o radu. Děkuji

Odkaz na kód:

http://pastebin.com/pbfiBtBD

 
Nahoru Odpovědět 4. října 21:43
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na ja13
Maxy_obr:

Snad nepíšu pozdě ale ta funkce ti nevrátí hlavičku pouze tělo. Nevím zda tam toho není víc ale určitě máš chybu u bkp tam má být base16 ne 64

Editováno 18. října 11:24
 
Nahoru Odpovědět 18. října 11:23
Avatar
ja13
Člen
Avatar
Odpovídá na Maxy_obr
ja13:

Nepíšeš pozdě, zatím jsem to odložil, protože nevím co dál... :-(

Ty máš funkci nebo již hotový kód, který Ti vrátí hlavičku?

 
Nahoru Odpovědět 18. října 16:08
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na ja13
Maxy_obr:

Tu hlavičku ti to nebude vracet nikdy, jde to snad jen pomocí nějakejch prográmků ale nevím já je nepoužíval. Tohle už ti ale nějaký výsledek vracet musí ne? Ještě koukám, ten var_dump co máš na konci vyhodí chybu zakomentuj ho.

Editováno 18. října 17:13
 
Nahoru Odpovědět 18. října 17:11
Avatar
ja13
Člen
Avatar
Odpovídá na Maxy_obr
ja13:

Nevím co máš na mysli prográmky... ;-) ale musí na to být nějaká knihovna, která to umí... nic externího...

Ty jsi to už nějak vyřešil?

 
Nahoru Odpovědět 18. října 18:21
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Programy které dokáži zachytit tu komunikaci. O žádných knihovnách nevím.
Ano vyřešil ale kód poskytnout nemohu.

 
Nahoru Odpovědět 18. října 18:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 50 zpráv z 50.