|
Strona główna Zbieranina Serwisy Porady Projekty Humor sektora IT TODO Nowości Ostatnie zmiany Kontakt Find pages
Set your name in
UserPreferences Referenced by
JSPWiki v2.2.33
|
Xml SignatureTable of ContentsWstępBiblioteka ta służy do cyfrowego podpisywania JavaBeanów a następnie do weryfikacji poprawności podpisanego JavaBeana. Nie mówi to wiele. Ale... Ale gdy weźmie się pod uwagę możliwość serializowania Biblioteka rozwiązuje problem plików konfiguracyjnych po stronie klienta, których klient nie powinien zmieniać, a które z różnych powodów lepiej przechowywać w jawnej postaci, a przynajmniej w łatwo dostępnym miejscu. Dużo łatwiej jest dostarczyć z aplikacją plik licencji z zapisanymi tam warunkami (np. datą do której aplikacja ma działać) niż na sztywno zapisywać w kodzie taki warunek. Używając XML Signature mamy problem rozwiązany. Kod aplikacji jest jeden, klient dostaje mały pliczek XML z zapisanymi danymi. Warunki licencji są jawnie zapisane w pliku. Ponieważ jednak plik jest cyfrowo podpisany to klient nie może wprowadzić do niego żadnych zmian, gdyż aplikacja wykryje niezgodność i np. się wyłączy. Moduł XmlSignature w repozytorium CVS Korzystanie z biblioteki jest podzielone na cztery etapy: Generowanie pary kluczyNajpierw należy wygenerować parę kluczy (prywatny i publiczny). Klucz prywatny jest używany do podpisywania obiektów, nie jest on udostępniany klientowi. Klucz publiczny jest zaszywany w programie i służy do weryfikacji poprawności podpisów obiektów. Do generowania kluczy można użyć klasy usługowej CreateKeys java -cp commons-codec-1.3.jar:xml-signature.jar org.rydzewski.signing.util.CreateKeysNa ekran zostaną wypisane wartości (w formacie Base64) kluczy prywatnego i publicznego. Zawartośc klucza prywatnego zapisujemy sobie do pliku, będziemy go później używać. Zawartość klucza publicznego zapisujemy do zmiennej typu String i umieszczamy w kodzie programu. Na potrzeby tego przykładu klucz prywatny zapisałem do pliku private.key a klucz publiczny do pliku public.key. Przygotowanie klasy JavaBean do podpisaniaZałóżmy, że chcemy podpisać dane zawarte w następującej klasie JavaBean:
public class TestBean extends org.rydzewski.signing.XmlSignableBean {
/** komentarz dla licencji */
private String comment;
/** data do kiedy program ma pracować */
private String validTo;
/** numer licencji */
private String number;
/** ustawia domyślne wartości pól */
public void initialize() {
comment = "";
validTo = "";
number = "";
}
public String getComment()
{
return comment;
}
public void setComment(String comment)
{
this.comment = comment;
}
public String getValidTo()
{
return validTo;
}
public void setValidTo(String validTo)
{
this.validTo = validTo;
}
public String getNumber()
{
return number;
}
public void setNumber(String number)
{
this.number = number;
}
}
Serializujemy więc naszego beana do pliku XML, można to zrobić np w taki sposób: java -cp .:xml-signature.jar org.rydzewski.signing.util.SerializeBean TestBean src.xml Teraz w pliku src.xml mamy zserializowaną zawartość beana, wygląda ona mniej więcej tak: <?xml version="1.0" encoding="UTF-8"?> <java version="1.5.0_05" class="java.beans.XMLDecoder"> <object class="TestBean"> <void property="comment"> <string></string> </void> <void property="number"> <string></string> </void> <void property="validTo"> <string></string> </void> </object> </java> Możemy teraz przeprowadzić edycję tego pliku. Ustawimy więc numer licencji oraz datę do której będzie ona ważna, plik po zmianach prezentuje się następująco: <?xml version="1.0" encoding="UTF-8"?> <java version="1.5.0_05" class="java.beans.XMLDecoder"> <object class="TestBean"> <void property="comment"> <string></string> </void> <void property="number"> <string>0001</string> </void> <void property="validTo"> <string>2007-01-01</string> </void> </object> </java> Podpisanie pliku XMLWykonujemy poniższe polecenie: java -cp .:commons-codec-1.3.jar:xml-signature.jar org.rydzewski.signing.util.SignBean private.key src.xml out.xml Teraz w pliku out.xml mamy podpisany plik XML. Taki plik możemy przekazać klientowi. Plik wygląda np. tak:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0_05" class="java.beans.XMLDecoder">
<object class="TestBean">
<void property="comment">
<string></string>
</void>
<void property="number">
<string>0001</string>
</void>
<void property="signature">
<array class="byte" length="64">
<void index="0">
<byte>77</byte>
</void>
<void index="1">
<byte>67</byte>
</void>
... i sporo danych tutaj ...
<void property="validTo">
<string>2007-01-01</string>
</void>
</object>
</java>
Weryfikacja pliku XMLZ linii poleceń możemy zweryfikować poprawność podpisu za pomocą polecenia: java -cp .:commons-codec-1.3.jar:xml-signature.jar org.rydzewski.signing.util.VerifyBean public.key out.xml Z poziomu kodu programu zwykle robi się to w następujący sposób:
// klucz publiczny otrzymany w pierwszym kroku
String publicKey = ...;
XMLDecoder decoder = new XMLDecoder(sciezka_do_pliku_xml_do_weryfikacji);
XmlSingnable bean = (XmlSignable)decoder.readObject();
decoder.close();
AsciiVerifier asciiVerifier = new AsciiVerifier(publicKey.getBytes());
ObjectVerifier objectVerifier = new ObjectVerifier(asciiVerifier);
configOk = objectVerifier.verify(bean);
Możemy sprawdzić poprawność procesu weryfikacji. Wystarczy zmienić zawartośc podpisanego pliku out.xml. Próba jego weryfikacji zakończy się niepowodzeniem.
|
||||||