<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>security &amp;mdash; Paweł Goleń, blog</title>
    <link>https://wampir.mroczna-zaloga.org/tag:security</link>
    <description></description>
    <pubDate>Wed, 15 Apr 2026 04:54:03 +0000</pubDate>
    <item>
      <title>Ściany mają uszy (i potrafią mówić)</title>
      <link>https://wampir.mroczna-zaloga.org/sciany-maja-uszy-i-potrafia-mowic</link>
      <description>&lt;![CDATA[Dziś wpis na nietypowy temat - aplikacje na Androida. A konkretnie odrobina o ich bezpieczeństwie.&#xA;&#xD;&#xA;!--more--&#xD;&#xA;Nie będę wnikał tu w szczegóły, ale krótkie wprowadzenie się przyda. Mamy więc Activity, z których składa się aplikacja (a przynajmniej jej GUI). Aplikacja może składać się z wielu takich elementów, może też korzystać z funkcji zdefiniowanych w innych aplikacjach. Do tego przydaje się Intent. Każda aplikacja w pliku AndroidManifest.xml umieszcza listę swoich Activity (i nie tylko, ja w tym kontekście warto jeszcze wspomnieć o Service). Domyślnie Activity i Service są &#34;lokalne&#34; dla danej aplikacji, ale jeśli zdefiniowany zostanie IntentFilter, to stają się one dostępne dla innych aplikacji w systemie. Jeśli chcemy ograniczyć jakie aplikacje powinny móc korzystać z komponentów naszej aplikacji, musimy ustalić odpowiednie permission.&#xA;&#xA;Do czego służy Service? Ten cytat z dokumentacji jest chyba wystarczającym wyjaśnieniem:&#xA;&#xA;  A Service is an application component representing either an application&#39;s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. &#xA;&#xA;Teraz załóżmy, że nasz użytkownik będąc na jakimś Activity chce wywołać operację, która może zająć wiele czasu i w szczególności może zakończyć się niepowodzeniem. By nie spowodować zamrożenia GUI (albo wkurzającej &#34;kręcioły&#34;), programista może tą funkcję zaimplementować w usłudze i z poziomu Activity wywołać tę usługę poprzez wywołanie funkcji startService. W szczególności może być tak, że wyśle on w tym miejscu Intent o określonej nazwie, a system wywoła usługę, która ma zarejestrowany odpowiedni IntentFilter. I teraz ważna sprawa Intent może być wysłany &#34;rozgłoszeniowo&#34;.&#xA;&#xA;W jaki sposób rezultat pracy usługi może być zwrócony do Activity? Na przykład wysyłając broadcast, który w pewnych przypadkach może trafić do wszystkich aplikacji na urządzeniu, które zarejestrowały odpowiednie filtry (patrz BroadcastReceiver: Security).&#xA;&#xA;Widzicie już potencjalny problem? Zresztą ta kwestia jest dość dokładnie pokazana w dokumentacji Androida, ale na wszelki wypadek:&#xA;&#xA;  zewnętrzna aplikacja może wywołać usługę w &#34;naszej&#34; aplikacji,&#xA;  zewnętrzna aplikacja może otrzymywać komunikaty z rezultatem wywołania usługi,&#xA;&#xA;Oczywiście może , ale wcale nie musi , muszą ku temu zaistnieć sprzyjające okoliczności (błędy).&#xA;&#xA;Do czego to może prowadzić? Wyobraźmy sobie aplikację, niech będzie to aplikacja bankowości internetowej, która skonstruowana jest w następujący sposób:&#xA;&#xA;  W Activity nie ma żadnego kodu do komunikacji z serwerem,&#xA;  Komunikacja z serwerem jest realizowana w Service,&#xA;  Po logowaniu tworzony jest obiekt odpowiadający za komunikację poszczególnych Service z serwerem,&#xA;  Activity wywołuje Service wysyłając odpowiedni Intent,&#xA;  Service zwraca rezultat wywołania wysyłając odpowiedni Intent (broadcast),&#xA;&#xA;Do czasu, gdy Intenty wymienione między Activity i Service są lokalne (patrz np. LocalBroadcastManager) a usługi nie są eksportowane (patrz: android:exported), problemu w zasadzie nie ma. Co jednak, jeśli zaistnieją &#34;sprzyjające okoliczności&#34;?&#xA;&#xA;Potencjalny scenariusz ataku jest prosty. Zewnętrzna aplikacja może:&#xA;&#xA;  zarejestrować BroadcastReceiver dla interesujących ją Intent,&#xA;  wołać pewne funkcje API poprzez wywoływanie Service z odpowiednim Intent,&#xA;&#xA;Skutkiem takiej podatności będzie co najmniej wyciek danych. Piszę co najmniej, bo teoretycznie mogę wyobrazić sobie sytuację, w której korzystając z socjotechniki wroga aplikacja skłoni użytkownika do podania kodu autoryzującego transakcję.&#xA;&#xA;Cała ta sytuacja kojarzy mi się z następującym (hipotetycznym?) przykładem. W pokoju pracuje dwie osoby, &#34;wywołują&#34; wzajemnie swoje &#34;usługi&#34; rozmawiając ze sobą, a rozmawiają na tematy &#34;wrażliwe&#34; i mają możliwość wywołania &#34;wrażliwych&#34; operacji (np. &#34;odblokuj mi konto X i ustaw hasło na Y&#34;). I tak żyją sobie spokojnie przez długi czas, aż pewnego dnia w pokoju pojawia się trzecia osoba. Sposób pracy dwóch &#34;starych&#34; osób nie ulega zmianie, ale zmieniło się środowisko. Nowa osoba może po pierwsze uzyskać interesującą wiedzę tylko słuchając rozmowy (taki BroadcastReceiver). Może też spróbować &#34;ataku aktywnego&#34;, czyli po prostu spróbować poprosić kogoś o zrobienie czegoś, do czego ten nowy pracownik nie ma uprawnień. Zadziała? Może, ale nie musi. Nie musi, bo my ludzie mamy często domyślnie włączony mechanizm uwierzytelnienia oparty na biometrii - rozpoznajemy osobę po głosie. To dlatego w przypadku przekrętu &#34;na wnuczka&#34; pojawia się chore gardło.&#xA;&#xD;&#xA;&#xD;&#xA;Oryginał tego wpisu dostępny jest pod adresem Ściany mają uszy (i potrafią mówić)&#xA;&#xA;smallAutor: Paweł Goleń/small]]&gt;</description>
      <content:encoded><![CDATA[<p>Dziś wpis na nietypowy temat – aplikacje na Androida. A konkretnie odrobina o ich bezpieczeństwie.</p>



<p>Nie będę wnikał tu w szczegóły, ale krótkie wprowadzenie się przyda. Mamy więc <a href="http://developer.android.com/reference/android/app/Activity.html">Activity</a>, z których składa się aplikacja (a przynajmniej jej GUI). Aplikacja może składać się z wielu takich elementów, może też korzystać z funkcji zdefiniowanych w innych aplikacjach. Do tego przydaje się <a href="http://developer.android.com/reference/android/content/Intent.html">Intent</a>. Każda aplikacja w pliku <a href="http://developer.android.com/guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a> umieszcza listę swoich Activity (i nie tylko, ja w tym kontekście warto jeszcze wspomnieć o <a href="http://developer.android.com/reference/android/app/Service.html">Service</a>). Domyślnie Activity i Service są “lokalne” dla danej aplikacji, ale jeśli zdefiniowany zostanie <a href="http://developer.android.com/reference/android/content/IntentFilter.html">IntentFilter</a>, to stają się one dostępne dla innych aplikacji w systemie. Jeśli chcemy ograniczyć jakie aplikacje powinny móc korzystać z komponentów naszej aplikacji, musimy ustalić odpowiednie <a href="http://developer.android.com/guide/topics/security/permissions.html">permission</a>.</p>

<p>Do czego służy Service? Ten cytat z dokumentacji jest chyba wystarczającym wyjaśnieniem:</p>

<blockquote><p>A Service is an application component representing either an application&#39;s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.</p></blockquote>

<p>Teraz załóżmy, że nasz użytkownik będąc na jakimś Activity chce wywołać operację, która może zająć wiele czasu i w szczególności może zakończyć się niepowodzeniem. By nie spowodować zamrożenia GUI (albo wkurzającej “kręcioły”), programista może tą funkcję zaimplementować w usłudze i z poziomu Activity wywołać tę usługę poprzez wywołanie funkcji <a href="http://developer.android.com/reference/android/content/Context.html#startService%2528android.content.Intent%2529">startService</a>. W szczególności może być tak, że wyśle on w tym miejscu Intent o określonej nazwie, a system wywoła usługę, która ma zarejestrowany odpowiedni IntentFilter. I teraz ważna sprawa Intent może być wysłany “rozgłoszeniowo”.</p>

<p>W jaki sposób rezultat pracy usługi może być zwrócony do Activity? Na przykład wysyłając broadcast, który w pewnych przypadkach może trafić do wszystkich aplikacji na urządzeniu, które zarejestrowały odpowiednie filtry (patrz <a href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#Security">BroadcastReceiver: Security</a>).</p>

<p>Widzicie już potencjalny problem? Zresztą ta kwestia jest dość dokładnie pokazana w dokumentacji Androida, ale na wszelki wypadek:</p>
<ul><li>zewnętrzna aplikacja <em>może</em> wywołać usługę w “naszej” aplikacji,</li>
<li>zewnętrzna aplikacja <em>może</em> otrzymywać komunikaty z rezultatem wywołania usługi,</li></ul>

<p>Oczywiście <em>może</em> , ale wcale <em>nie musi</em> , muszą ku temu zaistnieć sprzyjające okoliczności (błędy).</p>

<p>Do czego to może prowadzić? Wyobraźmy sobie aplikację, niech będzie to aplikacja bankowości internetowej, która skonstruowana jest w następujący sposób:</p>
<ul><li>W Activity nie ma żadnego kodu do komunikacji z serwerem,</li>
<li>Komunikacja z serwerem jest realizowana w Service,</li>
<li>Po logowaniu tworzony jest obiekt odpowiadający za komunikację poszczególnych Service z serwerem,</li>
<li>Activity wywołuje Service wysyłając odpowiedni Intent,</li>
<li>Service zwraca rezultat wywołania wysyłając odpowiedni Intent (broadcast),</li></ul>

<p>Do czasu, gdy Intenty wymienione między Activity i Service są lokalne (patrz np. <a href="http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html">LocalBroadcastManager</a>) a usługi nie są eksportowane (patrz: <a href="http://developer.android.com/guide/topics/manifest/service-element.html#exported">android:exported</a>), problemu w zasadzie nie ma. Co jednak, jeśli zaistnieją “sprzyjające okoliczności”?</p>

<p>Potencjalny scenariusz ataku jest prosty. Zewnętrzna aplikacja może:</p>
<ul><li>zarejestrować <a href="http://developer.android.com/reference/android/content/BroadcastReceiver.html">BroadcastReceiver</a> dla interesujących ją Intent,</li>
<li>wołać pewne funkcje API poprzez wywoływanie Service z odpowiednim Intent,</li></ul>

<p>Skutkiem takiej podatności będzie co najmniej wyciek danych. Piszę co najmniej, bo <em>teoretycznie</em> mogę wyobrazić sobie sytuację, w której korzystając z socjotechniki wroga aplikacja skłoni użytkownika do podania kodu autoryzującego transakcję.</p>

<p>Cała ta sytuacja kojarzy mi się z następującym (hipotetycznym?) przykładem. W pokoju pracuje dwie osoby, “wywołują” wzajemnie swoje “usługi” rozmawiając ze sobą, a rozmawiają na tematy “wrażliwe” i mają możliwość wywołania “wrażliwych” operacji (np. “odblokuj mi konto X i ustaw hasło na Y”). I tak żyją sobie spokojnie przez długi czas, aż pewnego dnia w pokoju pojawia się trzecia osoba. Sposób pracy dwóch “starych” osób nie ulega zmianie, ale zmieniło się środowisko. Nowa osoba może po pierwsze uzyskać interesującą wiedzę tylko słuchając rozmowy (taki BroadcastReceiver). Może też spróbować “ataku aktywnego”, czyli po prostu spróbować poprosić kogoś o zrobienie czegoś, do czego ten nowy pracownik nie ma uprawnień. Zadziała? Może, ale nie musi. Nie musi, bo my ludzie mamy często domyślnie włączony mechanizm uwierzytelnienia oparty na biometrii – rozpoznajemy osobę po głosie. To dlatego w przypadku przekrętu “na wnuczka” pojawia się <a href="http://opole.gazeta.pl/opole/1,35114,9867331,Przerazajace_techniki_wyludzania_na__wnuczka___POLICYJNE.html">chore gardło</a>.</p>

<p><em>Oryginał tego wpisu dostępny jest pod adresem <a href="https://archive.mroczna-zaloga.org/archives/1156-ciany-maj-uszy-i-potrafi-mowi.html">Ściany mają uszy (i potrafią mówić)</a></em></p>

<p><small>Autor: <a href="https://wampir.mroczna-zaloga.org/o-mnie">Paweł Goleń</a></small></p>
]]></content:encoded>
      <guid>https://wampir.mroczna-zaloga.org/sciany-maja-uszy-i-potrafia-mowic</guid>
      <pubDate>Sun, 25 Nov 2012 21:34:00 +0000</pubDate>
    </item>
    <item>
      <title>Wyciąganie błędnych wniosków II</title>
      <link>https://wampir.mroczna-zaloga.org/wyciaganie-blednych-wnioskow-ii</link>
      <description>&lt;![CDATA[Dziś dwa przykłady, w których na podstawie pewnych przesłanek wyciągnięty zostały pewne wnioski. Co w tym ciekawego? To, że wnioski te były nie do końca uzasadnione.&#xA;&#xD;&#xA;!--more--&#xD;&#xA;Pierwszy przykład to ta wypowiedź:&#xA;&#xA;  #fail #security rapidshare.com nie szyfruje haseł dostałem maila z moim hasłem. A nie link do zmiany jego ... &#xA;&#xA;Pytanie - czy na podstawie otrzymania zapomnianego hasła można wyciągnąć wniosek, że hasło nie jest szyfrowane? A może jest tak:&#xA;&#xA;  Przypominam, że jeśli hasło jest ZASZYFROWANE, to można je ODSZYFROWAĆ i wysłać użytkownikowi. Może więc jednak szyfruje :) &#xA;&#xA;Z dużym prawdopodobieństwem można przypuszczać, że rzeczywiście hasło po stronie serwera jest przechowywane w formie jawnej. Jest to jednak tylko przypuszczenie, przesłanka, którą w tym przypadku dysponujemy nie jest wystarczająca, by stwierdzić, że hasło nie jest szyfrowane. Wystarcza natomiast do tego, by stwierdzić, że hasło nie jest przechowywane w postaci hasha. W mojej ocenie pojęcie szyfrowania oznacza takie przekształcenie wiadomości, które umożliwia jej odzyskanie (odszyfrowanie). Nie jest więc wykluczone, że jakiś serwis przechowuje hasła w formie szyfrowanej, a gdy jakiś użytkownik hasła zapomni, jest ono odszyfrowane i wysyłane mu mailem. Temat przechowywania haseł poruszałem już wielokrotnie, zainteresowanych odsyłam na przykład tu: O przechowywaniu haseł.&#xA;&#xA;Ktoś może uznać, że się czepiam. Pewnie coś w tym jest, ale moim zdaniem precyzja wypowiedzi jest istotna. Szyfrowanie hasła to nie to samo, co przechowywanie hasha hasła. Przechowywanie hasła w formie szyfrowanej jest prawie tak złe, jak przechowywanie go w formie jawnej, ale... Tu niespodzianka - istnieją protokoły uwierzytelniania, które wymagają hasła użytkownika w formie jawnej, jeśli więc są one stosowane, przechowywanie hasła w formie zaszyfrowanej może być uzasadnione. Taka funkcja istnieje nawet w Windows: Store passwords using reversible encryption.&#xA;&#xA;Na zakończenie tego przykładu pytanie - czy fakt otrzymania linku do zmiany hasła pozwala na stwierdzenie, że po stronie serwera hasło nie jest przechowywane w formie jawnej lub szyfrowanej?&#xA;&#xA;Teraz drugi przykład. Natknąłem się na niego, gdy szukałem komentarzy ludzi na temat wygody i bezpieczeństwa haseł maskowanych. Znalazłem między innymi ten wpis:  Bezpieczne metody uwierzytelniania użytkowników, a pod nim następujący komentarz:&#xA;&#xA;  Krew się we mnie zagotowała jak przeczytałem ten wpis. Czy wie Pan o czym świadczy pytanie o losowe litery z hasła? O tym, że hasło trzymane jest w \\postaci niezaszyfrowanej\\ co urąga wszelkim zasadom bezpieczeństwa, szczególnie w banku! (...) &#xA;&#xA;Czy autor tego komentarza ma rację? Chodzi mi tu o cytowaną część komentarza, która dotyczy haseł maskowanych przy uwierzytelnieniu w systemach bankowości internetowej.&#xA;&#xA;Odpowiedź na to pytanie brzmi: to zależy. Nie jest tak, jak sugeruje autor, że użycie hasła maskowanego zawsze oznacza przechowywanie hasła w postaci jawnej (lub zaszyfrowanej). To zależy od konkretnej implementacji. Są takie, które w chwili zmiany hasła generują pewną liczbę masek i wyliczają stosowne hashe. W tym przypadku hasło nie musi i nie jest przechowywane w postaci jawnej. Są również i takie rozwiązania, w których hasło w takiej postaci najprawdopodobniej jest przechowywane. Świadczą o tym przekształcenia wykonywane po stronie klienta (w przeglądarce) po wpisaniu hasła. Takim sygnałem może być przekształcenie typu:&#xA;    &#xA;    &#xD;&#xA;    sha1(token, pwd)&#xD;&#xA;    &#xA;&#xA;gdzie token jest losowy i unikalny dla każdej próby uwierzytelnienia, natomiast pwd to fragment hasła wpisany przez użytkownika. Ale jeśli przekształcenie przyjmuje formę:&#xA;    &#xA;    &#xD;&#xA;    sha1(token, sha1(pwd))&#xD;&#xA;    &#xA;&#xA;nie ma już konieczności przechowywania w bazie hasła w formie jawnej. Tu pozwolę sobie przypomnieć o jednym z udostępnionych przeze mnie wyzwań, w którym przekształcenia wykonywane na wpisanym przez użytkownika haśle przed wysłaniem go do serwera są dość istotne.&#xA;&#xA;Dlaczego podaję te przykłady? Wyciąganie na podstawie istniejących przesłanek błędnych lub nieuprawnionych wniosków, może być szkodliwe. Jeśli dochodzimy do etapu wnioskowania, warto zastanowić się, które z naszych wniosków mają twarde dowody, a które opierają się w znacznej części na naszej intuicji. Być może warto przeprowadzić jakieś dodatkowe testy, które nasz wniosek potwierdzą, lub obalą.&#xA;&#xD;&#xA;&#xD;&#xA;Oryginał tego wpisu dostępny jest pod adresem Wyciąganie błędnych wniosków II&#xA;&#xA;smallAutor: Paweł Goleń/small]]&gt;</description>
      <content:encoded><![CDATA[<p>Dziś dwa przykłady, w których na podstawie pewnych przesłanek wyciągnięty zostały pewne wnioski. Co w tym ciekawego? To, że wnioski te były nie do końca uzasadnione.</p>



<p>Pierwszy przykład to <a href="http://blip.pl/s/105512171">ta wypowiedź</a>:</p>

<blockquote><p><a href="https://wampir.mroczna-zaloga.org/tag:fail" class="hashtag"><span>#</span><span class="p-category">fail</span></a> <a href="https://wampir.mroczna-zaloga.org/tag:security" class="hashtag"><span>#</span><span class="p-category">security</span></a> rapidshare.com nie szyfruje haseł dostałem maila z moim hasłem. A nie link do zmiany jego ...</p></blockquote>

<p>Pytanie – czy na podstawie otrzymania zapomnianego hasła można wyciągnąć wniosek, że hasło nie jest szyfrowane? A może <a href="http://blip.pl/s/105539181">jest tak</a>:</p>

<blockquote><p>Przypominam, że jeśli hasło jest ZASZYFROWANE, to można je ODSZYFROWAĆ i wysłać użytkownikowi. Może więc jednak szyfruje :)</p></blockquote>

<p>Z dużym prawdopodobieństwem można przypuszczać, że rzeczywiście hasło po stronie serwera jest przechowywane w formie jawnej. Jest to jednak tylko przypuszczenie, przesłanka, którą w tym przypadku dysponujemy nie jest wystarczająca, by stwierdzić, że hasło nie jest <em>szyfrowane</em>. Wystarcza natomiast do tego, by stwierdzić, że hasło nie jest przechowywane w postaci hasha. W mojej ocenie pojęcie <em>szyfrowania</em> oznacza takie przekształcenie wiadomości, które umożliwia jej odzyskanie (odszyfrowanie). Nie jest więc wykluczone, że jakiś serwis przechowuje hasła w formie szyfrowanej, a gdy jakiś użytkownik hasła zapomni, jest ono odszyfrowane i wysyłane mu mailem. Temat przechowywania haseł poruszałem już wielokrotnie, zainteresowanych odsyłam na przykład tu: <a href="//wampir.mroczna-zaloga.org/archives/678-o-przechowywaniu-hasel.html">O przechowywaniu haseł</a>.</p>

<p>Ktoś może uznać, że się czepiam. Pewnie coś w tym jest, ale moim zdaniem precyzja wypowiedzi jest istotna. Szyfrowanie hasła to nie to samo, co przechowywanie hasha hasła. Przechowywanie hasła w formie szyfrowanej jest prawie tak złe, jak przechowywanie go w formie jawnej, ale... Tu niespodzianka – istnieją protokoły uwierzytelniania, które wymagają hasła użytkownika w formie jawnej, jeśli więc są one stosowane, przechowywanie hasła w formie zaszyfrowanej może być uzasadnione. Taka funkcja istnieje nawet w Windows: <a href="http://technet.microsoft.com/en-us/library/cc784581%2528WS.10%2529.aspx">Store passwords using reversible encryption</a>.</p>

<p>Na zakończenie tego przykładu pytanie – czy fakt otrzymania linku do zmiany hasła pozwala na stwierdzenie, że po stronie serwera hasło nie jest przechowywane w formie jawnej lub szyfrowanej?</p>

<p>Teraz drugi przykład. Natknąłem się na niego, gdy szukałem komentarzy ludzi na temat wygody i bezpieczeństwa haseł maskowanych. Znalazłem między innymi ten wpis: <a href="http://wi%C4%99cek.pl/bezpieczne-metody-uwierzytelniania.html"> Bezpieczne metody uwierzytelniania użytkowników</a>, a pod nim <a href="http://wi%C4%99cek.pl/bezpieczne-metody-uwierzytelniania.html#comment-464">następujący komentarz</a>:</p>

<blockquote><p>Krew się we mnie zagotowała jak przeczytałem ten wpis. Czy wie Pan o czym świadczy pytanie o losowe litery z hasła? O tym, że hasło trzymane jest w \*postaci niezaszyfrowanej\* co urąga wszelkim zasadom bezpieczeństwa, szczególnie w banku! (...)</p></blockquote>

<p>Czy autor tego komentarza ma rację? Chodzi mi tu o cytowaną część komentarza, która dotyczy haseł maskowanych przy uwierzytelnieniu w systemach bankowości internetowej.</p>

<p>Odpowiedź na to pytanie brzmi: <em>to zależy</em>. Nie jest tak, jak sugeruje autor, że użycie hasła maskowanego <em>zawsze</em> oznacza przechowywanie hasła w postaci jawnej (lub zaszyfrowanej). To zależy od konkretnej implementacji. Są takie, które w chwili zmiany hasła generują pewną liczbę masek i wyliczają stosowne hashe. W tym przypadku hasło nie musi i nie jest przechowywane w postaci jawnej. Są również i takie rozwiązania, w których hasło w takiej postaci najprawdopodobniej jest przechowywane. Świadczą o tym przekształcenia wykonywane po stronie klienta (w przeglądarce) po wpisaniu hasła. Takim sygnałem może być przekształcenie typu:</p>

<p>    sha1(token, pwd)</p>

<p>gdzie <em>token</em> jest losowy i unikalny dla każdej próby uwierzytelnienia, natomiast <em>pwd</em> to fragment hasła wpisany przez użytkownika. Ale jeśli przekształcenie przyjmuje formę:</p>

<p>    sha1(token, sha1(pwd))</p>

<p>nie ma już konieczności przechowywania w bazie hasła w formie jawnej. Tu pozwolę sobie przypomnieć o <a href="http://threats.pl/bezpieczenstwo-aplikacji-internetowych/wyzwanie">jednym z udostępnionych przeze mnie wyzwań</a>, w którym przekształcenia wykonywane na wpisanym przez użytkownika haśle przed wysłaniem go do serwera są dość istotne.</p>

<p>Dlaczego podaję te przykłady? Wyciąganie na podstawie istniejących przesłanek błędnych lub nieuprawnionych wniosków, może być szkodliwe. Jeśli dochodzimy do etapu wnioskowania, warto zastanowić się, które z naszych wniosków mają <em>twarde</em> dowody, a które opierają się w znacznej części na naszej <em>intuicji</em>. Być może warto przeprowadzić jakieś dodatkowe testy, które nasz wniosek potwierdzą, lub obalą.</p>

<p><em>Oryginał tego wpisu dostępny jest pod adresem <a href="https://archive.mroczna-zaloga.org/archives/886-wyciganie-bdnych-wnioskow-ii.html">Wyciąganie błędnych wniosków II</a></em></p>

<p><small>Autor: <a href="https://wampir.mroczna-zaloga.org/o-mnie">Paweł Goleń</a></small></p>
]]></content:encoded>
      <guid>https://wampir.mroczna-zaloga.org/wyciaganie-blednych-wnioskow-ii</guid>
      <pubDate>Thu, 15 Jul 2010 20:04:00 +0000</pubDate>
    </item>
  </channel>
</rss>