author | Christian Urban <christian dot urban at kcl dot ac dot uk> |
Fri, 26 Sep 2014 10:01:46 +0100 | |
changeset 183 | 6ed7c9b8b291 |
parent 182 | 681e35f6b0e4 |
child 184 | 55968b3205cc |
permissions | -rw-r--r-- |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
1 |
\documentclass{article} |
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
2 |
\usepackage{../style} |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
3 |
\usepackage{../langs} |
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
4 |
|
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
5 |
\lstset{language=JavaScript} |
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
6 |
|
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
7 |
\begin{document} |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
8 |
|
167
d8657ff8cca1
typos
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
160
diff
changeset
|
9 |
\section*{Handout 1 (Security Engineering)} |
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
10 |
|
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
11 |
Much of the material and inspiration in this module is taken |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
12 |
from the works of Bruce Schneier, Ross Anderson and Alex |
159
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
13 |
Halderman. I think they are the world experts in the area of |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
14 |
security engineering. I especially like that they argue that a |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
15 |
security engineer requires a certain \emph{security mindset}. |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
16 |
Bruce Schneier for example writes: |
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
17 |
|
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
18 |
\begin{quote} |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
19 |
\it ``Security engineers --- at least the good ones --- see |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
20 |
the world differently. They can't walk into a store without |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
21 |
noticing how they might shoplift. They can't use a computer |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
22 |
without wondering about the security vulnerabilities. They |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
23 |
can't vote without trying to figure out how to vote twice. |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
24 |
They just can't help it.'' |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
25 |
\end{quote} |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
26 |
|
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
27 |
\begin{quote} |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
28 |
\it ``Security engineering\ldots requires you to think |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
29 |
differently. You need to figure out not how something works, |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
30 |
but how something can be made to not work. You have to imagine |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
31 |
an intelligent and malicious adversary inside your system |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
32 |
\ldots, constantly trying new ways to |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
33 |
subvert it. You have to consider all the ways your system can |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
34 |
fail, most of them having nothing to do with the design |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
35 |
itself. You have to look at everything backwards, upside down, |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
36 |
and sideways. You have to think like an alien.'' |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
37 |
\end{quote} |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
38 |
|
159
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
39 |
\noindent In this module I like to teach you this security |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
40 |
mindset. This might be a mindset that you think is very |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
41 |
foreign to you---after all we are all good citizens and not |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
42 |
hack into things. I beg to differ: You have this mindset |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
43 |
already when in school you were thinking, at least |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
44 |
hypothetically, about ways in which you can cheat in an exam |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
45 |
(whether it is about hiding notes or looking over the |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
46 |
shoulders of your fellow pupils). Right? To defend a system, |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
47 |
you need to have this kind mindset and be able to think like |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
48 |
an attacker. This will include understanding techniques that |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
49 |
can be used to compromise security and privacy in systems. |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
50 |
This will many times result in insights where well-intended |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
51 |
security mechanisms made a system actually less |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
52 |
secure.\smallskip |
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
53 |
|
159
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
54 |
{\Large\bf Warning!} However, don’t be evil! Using those |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
55 |
techniques in the real world may violate the law or King’s |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
56 |
rules, and it may be unethical. Under some circumstances, even |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
57 |
probing for weaknesses of a system may result in severe |
160
4cbd6ca025e6
updated slides
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
159
diff
changeset
|
58 |
penalties, up to and including expulsion, fines and |
159
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
59 |
jail time. Acting lawfully and ethically is your |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
60 |
responsibility. Ethics requires you to refrain from doing |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
61 |
harm. Always respect privacy and rights of others. Do not |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
62 |
tamper with any of King's systems. If you try out a technique, |
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
63 |
always make doubly sure you are working in a safe environment |
160
4cbd6ca025e6
updated slides
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
159
diff
changeset
|
64 |
so that you cannot cause any harm, not even accidentally. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
65 |
Don't be evil. Be an ethical hacker.\medskip |
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
66 |
|
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
67 |
\noindent |
169
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
68 |
In this lecture I want to make you familiar with the security mindset |
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
69 |
and dispel the myth that encryption is the answer to all security |
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
70 |
problems (it is certainly often part of an answer, but almost always |
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
71 |
never a sufficient one). This is actually an important thread going |
159
77cf0362b87a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
158
diff
changeset
|
72 |
through the whole course: We will assume that encryption works |
169
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
73 |
perfectly, but still attack ``things''. By ``works perfectly'' we mean |
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
74 |
that we will assume encryption is a black box and, for example, will |
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
75 |
not look at the underlying mathematics and break the |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
76 |
algorithms.\footnote{Though fascinating this might be.} |
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
77 |
|
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
78 |
For a secure system, it seems, four requirements need to come |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
79 |
together: First a security policy (what is supposed to be |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
80 |
achieved?); second a mechanism (cipher, access controls, |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
81 |
tamper resistance etc); third the assurance we obtain from the |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
82 |
mechanism (the amount of reliance we can put on the mechanism) |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
83 |
and finally the incentives (the motive that the people |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
84 |
guarding and maintaining the system have to do their job |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
85 |
properly, and also the motive that the attackers have to try |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
86 |
to defeat your policy). The last point is often overlooked, |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
87 |
but plays an important role. To illustrate this lets look at |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
88 |
an example. |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
89 |
|
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
90 |
\subsubsection*{Chip-and-PIN is Surely More Secure?} |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
91 |
|
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
92 |
The questions is whether the Chip-and-PIN system used with |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
93 |
modern credit cards is more secure than the older method of |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
94 |
signing receipts at the till. On first glance the answer seems |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
95 |
obvious: Chip-and-PIN must be more secure and indeed improved |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
96 |
security was the central plank in the ``marketing speak'' of |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
97 |
the banks behind Chip-and-PIN. The earlier system was based on |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
98 |
a magnetic stripe or a mechanical imprint on the cards and |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
99 |
required customers to sign receipts at the till whenever they |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
100 |
bought something. This signature authorised the transactions. |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
101 |
Although in use for a long time, this system had some crucial |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
102 |
security flaws, including making clones of credit cards and |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
103 |
forging signatures. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
104 |
|
177
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
105 |
Chip-and-PIN, as the name suggests, relies on data being |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
106 |
stored on a chip on the card and a PIN number for |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
107 |
authorisation. Even though the banks involved trumpeted their |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
108 |
system as being absolutely secure and indeed fraud rates |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
109 |
initially went down, security researchers were not convinced |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
110 |
(especially the group around Ross Anderson). To begin with, |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
111 |
the Chip-and-PIN system introduced a ``new player'' that |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
112 |
needed to be trusted: the PIN terminals and their |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
113 |
manufacturers. It was claimed that these terminals were |
177
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
114 |
tamper-resistant, but needless to say this was a weak link in |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
115 |
the system, which criminals successfully attacked. Some |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
116 |
terminals were even so skilfully manipulated that they |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
117 |
transmitted skimmed PIN numbers via built-in mobile phone |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
118 |
connections. To mitigate this flaw in the security of |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
119 |
Chip-and-PIN, you need to vet quite closely the supply chain |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
120 |
of such terminals. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
121 |
|
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
122 |
Later on Ross Anderson and his group were able to perform |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
123 |
man-in-the-middle attacks against Chip-and-PIN. Essentially |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
124 |
they made the terminal think the correct PIN was entered and |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
125 |
the card think that a signature was used. This is a kind of |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
126 |
\emph{protocol failure}. After discovery, the flaw was |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
127 |
mitigated by requiring that a link between the card and the |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
128 |
bank is established at every time the card is used. Even later |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
129 |
this group found another problem with Chip-and-PIN and ATMs |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
130 |
which did not generate random enough numbers (nonces) on which |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
131 |
the security of the underlying protocols relies. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
132 |
|
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
133 |
The problem with all this is that the banks who introduced |
177
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
134 |
Chip-and-PIN managed with the new system to shift the |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
135 |
liability for any fraud and the burden of proof onto the |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
136 |
customer. In the old system, the banks had to prove that the |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
137 |
customer used the card, which they often did not bother with. |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
138 |
In effect, if fraud occurred the customers were either refunded |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
139 |
fully or lost only a small amount of money. This |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
140 |
taking-responsibility-of-potential-fraud was part of the |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
141 |
``business plan'' of the banks and did not reduce their |
177
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
142 |
profits too much. |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
143 |
|
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
144 |
Since banks managed to successfully claim that their |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
145 |
Chip-and-PIN system is secure, they were under the new system |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
146 |
able to point the finger at the customer when fraud occurred: |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
147 |
customers must have been negligent loosing their PIN and they |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
148 |
had almost no way of defending themselves in such situations. |
177
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
149 |
That is why the work of \emph{ethical} hackers like Ross |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
150 |
Anderson's group was so important, because they and others |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
151 |
established that the bank's claim that their system is secure |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
152 |
and it must have been the customer's fault, was bogus. In 2009 |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
153 |
for example the law changed and the burden of proof went back |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
154 |
to the banks. They need to prove whether it was really the |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
155 |
customer who used a card or not. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
156 |
|
177
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
157 |
This is a classic example where a security design principle |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
158 |
was violated: Namely, the one who is in the position to |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
159 |
improve security, also needs to bear the financial losses if |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
160 |
things go wrong. Otherwise, you end up with an insecure |
46e581d66f3a
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
176
diff
changeset
|
161 |
system. In case of the Chip-and-PIN system, no good security |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
162 |
engineer would dare claim that it is secure beyond reproach: |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
163 |
the specification of the EMV protocol (underlying |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
164 |
Chip-and-PIN) is some 700 pages long, but still leaves out |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
165 |
many things (like how to implement a good random number |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
166 |
generator). No human being is able to scrutinise such a |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
167 |
specification and ensure it contains no flaws. Moreover, banks |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
168 |
can add their own sub-protocols to EMV. With all the |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
169 |
experience we already have, it is as clear as day that |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
170 |
criminals were eventually able to poke holes into it and |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
171 |
measures need to be taken to address them. However, with how |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
172 |
the system was set up, the banks had no real incentive to come |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
173 |
up with a system that is really secure. Getting the incentives |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
174 |
right in favour of security is often a tricky business. From a |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
175 |
customer point of view the system was much less secure than |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
176 |
the old signature-based method. |
173
9126c13a7d93
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
169
diff
changeset
|
177 |
|
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
178 |
\subsection*{Of Cookies and Salts} |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
179 |
|
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
180 |
Lets look at another example which will help with |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
181 |
understanding how passwords should be verified and stored. |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
182 |
Imagine you need to develop a web-application that has the |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
183 |
feature of recording how many times a customer visits a page. |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
184 |
For example in order to give a discount whenever the customer |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
185 |
has visited a webpage some $x$ number of times (say $x$ equal |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
186 |
$5$). There is one more constraint: we want to store the |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
187 |
information about the number of visits as a cookie on the |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
188 |
browser. I think, for a number of years the webpage of the New |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
189 |
York Times operated in this way: it allowed you to read ten |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
190 |
articles per month for free; if you wanted to read more, you |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
191 |
had to pay. My best guess is that it used cookies for |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
192 |
recording how many times their pages was visited, because if I |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
193 |
switched browsers I could easily circumvent the restriction |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
194 |
about ten articles. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
195 |
|
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
196 |
To implement our web-application it is good to look under the |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
197 |
hood what happens when a webpage is displayed in a browser. A |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
198 |
typical web-application works as follows: The browser sends a |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
199 |
GET request for a particular page to a server. The server |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
200 |
answers this request with a webpage in HTML (for our purposes |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
201 |
we can ignore the details about HTML). A simple JavaScript |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
202 |
program that realises a server answering with a ``hello |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
203 |
world'' webpage is as follows: |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
204 |
|
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
205 |
\begin{center} |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
206 |
\lstinputlisting{../progs/ap0.js} |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
207 |
\end{center} |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
208 |
|
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
209 |
\noindent The interesting lines are 4 to 7 where the answer to |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
210 |
the GET request is generated\ldots in this case it is just a |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
211 |
simple string. This program is run on the server and will be |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
212 |
executed whenever a browser initiates such a GET request. You |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
213 |
can run this program on your computer and then direct a |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
214 |
browser to the address \pcode{localhost:8000} in order to |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
215 |
simulate a request over the internet. |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
216 |
|
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
217 |
|
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
218 |
For our web-application of interest is the feature that the |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
219 |
server when answering the request can store some information |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
220 |
on the client's side. This information is called a |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
221 |
\emph{cookie}. The next time the browser makes another GET |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
222 |
request to the same webpage, this cookie can be read again by |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
223 |
the server. We can use cookies in order to store a counter |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
224 |
that records the number of times our webpage has been visited. |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
225 |
This can be realised with the following small program |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
226 |
|
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
227 |
\begin{center} |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
228 |
\lstinputlisting{../progs/ap2.js} |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
229 |
\end{center} |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
230 |
|
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
231 |
\noindent The overall structure of this program is the same as |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
232 |
the earlier one: Lines 7 to 17 generate the answer to a |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
233 |
GET-request. The new part is in Line 8 where we read the |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
234 |
cookie called \pcode{counter}. If present, this cookie will be |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
235 |
send together with the GET-request from the client. The value |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
236 |
of this counter will come in form of a string, therefore we |
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
237 |
use the function \pcode{parseInt} in order to transform it |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
238 |
into an integer. In case the cookie is not present, we default |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
239 |
the counter to zero. The odd looking construction \code{...|| |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
240 |
0} is realising this defaulting in JavaScript. In Line 9 we |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
241 |
increase the counter by one and store it back to the client |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
242 |
(under the name \pcode{counter}, since potentially more than |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
243 |
one value could be stored). In Lines 10 to 15 we test whether |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
244 |
this counter is greater or equal than 5 and send accordingly a |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
245 |
specially grafted message back to the client. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
246 |
|
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
247 |
Let us step back and analyse this program from a security |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
248 |
point of view. We store a counter in plain text on the |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
249 |
client's browser (which is not under our control). Depending |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
250 |
on this value we want to unlock a resource (like a discount) |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
251 |
when it reaches a threshold. If the client deletes the cookie, |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
252 |
then the counter will just be reset to zero. This does not |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
253 |
bother us, because the purported discount will just not be |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
254 |
granted. In this way we do not lose any (hypothetical) money. |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
255 |
What we need to be concerned about is, however, when a client |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
256 |
artificially increases this counter without having visited our |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
257 |
web-page. This is actually a trivial task for a knowledgeable |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
258 |
person, since there are convenient tools that allow one to set |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
259 |
a cookie to an arbitrary value, for example above our |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
260 |
threshold for the discount. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
261 |
|
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
262 |
There seems to be no simple way to prevent this kind of |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
263 |
tampering with cookies, because the whole purpose of cookies |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
264 |
is that they are stored on the client's side, which from the |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
265 |
the server's perspective is a potentially hostile environment. |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
266 |
What we need to ensure is the integrity of this counter in |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
267 |
this hostile environment. We could think of encrypting the |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
268 |
counter. But this has two drawbacks to do with the key for |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
269 |
encryption. If you use a single, global key for all the |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
270 |
clients that visit our site, then we risk that our whole |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
271 |
``business'' might collapse in the event this key gets known |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
272 |
to the outside world. Then all cookies we might have set in |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
273 |
the past, can now be decrypted and manipulated. If, on the |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
274 |
other hand, we use many ``private'' keys for the clients, then |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
275 |
we have to solve the problem of having to securely store this |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
276 |
key on our server side (obviously we cannot store the key with |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
277 |
the client because then the client again has all data to |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
278 |
tamper with the counter; and obviously we also cannot encrypt |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
279 |
the key, lest we can solve an impossible chicken-and-egg |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
280 |
problem). So encryption seems to not solve the problem we face |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
281 |
with the integrity of our counter. |
169
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
282 |
|
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
283 |
Fortunately, \emph{hash functions} seem to be more suitable |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
284 |
for our purpose. Like encryption, hash functions scramble data |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
285 |
in such a way that it is easy to calculate the output of a |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
286 |
hash function from the input. But it is hard (i.e.~practically |
175
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
287 |
impossible) to calculate the input from knowing the output. |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
288 |
Therefore hash functions are often called \emph{one-way |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
289 |
functions}\ldots you cannot go back from the output to the |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
290 |
input (without some tricks, see below). There are several such |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
291 |
hashing function. For example SHA-1 would hash the string |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
292 |
\pcode{"hello world"} to produce the hash-value |
175
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
293 |
|
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
294 |
\begin{center} |
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
295 |
\pcode{2aae6c35c94fcfb415dbe95f408b9ce91ee846ed} |
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
296 |
\end{center} |
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
297 |
|
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
298 |
\noindent Another handy feature of hash functions is that if |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
299 |
the input changes only a little, the output changes |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
300 |
drastically. For example \pcode{"iello world"} produces under |
175
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
301 |
SHA-1 the output |
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
302 |
|
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
303 |
\begin{center} |
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
304 |
\pcode{d2b1402d84e8bcef5ae18f828e43e7065b841ff1} |
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
305 |
\end{center} |
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
306 |
|
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
307 |
\noindent That means it is not predictable what the output |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
308 |
will be from just looking at input that is ``close by''. |
175
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
309 |
|
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
310 |
We can use hashes in our web-application and store in the |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
311 |
cookie the value of the counter in plain text but together |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
312 |
with its hash. We need to store both pieces of data in such a |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
313 |
way that we can extract them again later on (in the code below |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
314 |
I will just separate them using a \pcode{"-"}). If we now read |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
315 |
back the cookie when the client visits our webpage, we can |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
316 |
extract the counter, hash it again and compare the result to |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
317 |
the stored hash value inside the cookie. If these hashes |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
318 |
disagree, then we can deduce that the cookie has been tampered |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
319 |
with. Unfortunately, if they agree, we can still not be |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
320 |
entirely sure that not a clever hacker has tampered with the |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
321 |
cookie. The reason is that the hacker can see the clear text |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
322 |
part of the cookie, say \pcode{3}, and also its hash. It does |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
323 |
not take much trial and error to find out that we used the |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
324 |
SHA-1 hashing function and then the hacker can graft a cookie |
180
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
325 |
accordingly. This is eased by the fact that for SHA-1 many |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
326 |
strings and corresponding hash-values are precalculated. Type, |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
327 |
for example, into Google the hash value for \pcode{"hello |
a95782c2f046
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
179
diff
changeset
|
328 |
world"} and you will actually pretty quickly find that it was |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
329 |
generated by input string \pcode{"hello world"}. This defeats |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
330 |
the purpose of a hashing function and thus would not help us |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
331 |
with our web-applications and later also not with how to store |
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
332 |
passwords properly. |
175
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
333 |
|
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
334 |
|
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
335 |
There is one ingredient missing, which happens to be called |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
336 |
\emph{salts}. Salts are random keys, which are added to the |
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
337 |
counter before the hash is calculated. In our case we must |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
338 |
keep the salt secret. As can be see in Figure~\ref{hashsalt}, |
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
339 |
we need to extract from the cookie the counter value and the |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
340 |
hash (Lines 19 and 20). But before hashing the counter again |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
341 |
(Line 22) we need to add the secret salt. Similarly, when we |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
342 |
set the new increased counter, we will need to add the salt |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
343 |
before hashing (this is done in Line 15). Our web-application |
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
344 |
will now store cookies like |
175
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
345 |
|
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
346 |
\begin{figure}[p] |
178
13c6bd6e3477
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
177
diff
changeset
|
347 |
\lstinputlisting{../progs/App4.js} |
176
5336ad2fd3fa
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
175
diff
changeset
|
348 |
\caption{\label{hashsalt}} |
175
4ebc97e6fdf0
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
174
diff
changeset
|
349 |
\end{figure} |
169
2866fae8c1cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
168
diff
changeset
|
350 |
|
179
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
351 |
\begin{center}\tt |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
352 |
\begin{tabular}{l} |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
353 |
1 + salt - 8189effef4d4f7411f4153b13ff72546dd682c69\\ |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
354 |
2 + salt - 1528375d5ceb7d71597053e6877cc570067a738f\\ |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
355 |
3 + salt - d646e213d4f87e3971d9dd6d9f435840eb6a1c06\\ |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
356 |
4 + salt - 5b9e85269e4461de0238a6bf463ed3f25778cbba\\ |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
357 |
...\\ |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
358 |
\end{tabular} |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
359 |
\end{center} |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
360 |
|
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
361 |
\noindent These hashes allow us to read and set the value of |
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
362 |
the counter, and also give us confidence that the counter has |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
363 |
not been tampered with. This of course depends on being able |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
364 |
to keep the salt secret. Once the salt is public, we better |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
365 |
ignore all cookies and start setting them again with a new |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
366 |
salt. |
179
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
367 |
|
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
368 |
There is an interesting and very subtle point to note with |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
369 |
respect to the New York Times' way of checking the number |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
370 |
visits. Essentially they have their `resource' unlocked at the |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
371 |
beginning and lock it only when the data in the cookie states |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
372 |
that the allowed free number of visits are up. As said before, |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
373 |
this can be easily circumvented by just deleting the cookie or |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
374 |
by switching the browser. This would mean the New York Times |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
375 |
will lose revenue whenever this kind of tampering occurs. The |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
376 |
quick fix to require that a cookie must always be present does |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
377 |
not work, because then this newspaper will cut off any new |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
378 |
readers, or anyone who gets a new computer. In contrast, our |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
379 |
web-application has the resource (discount) locked at the |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
380 |
beginning and only unlocks it if the cookie data says so. If |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
381 |
the cookie is deleted, well then the resource just does not |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
382 |
get unlocked. No mayor harm will result to us. You can see: |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
383 |
the same security mechanism behaves rather differently |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
384 |
depending on whether the ``resource'' needs to be locked or |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
385 |
unlocked. Apart from thinking about the difference very |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
386 |
carefully, I do not know of any good ``theory'' that could |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
387 |
help with solving such security intricacies in any other way. |
179
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
388 |
|
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
389 |
\subsection*{How to Store Passwords Properly?} |
179
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
390 |
|
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
391 |
While admittedly quite silly, the simple web-application in |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
392 |
the previous section should help with the more important |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
393 |
question of how passwords should be verified and stored. It is |
179
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
394 |
unbelievable that nowadays systems still do this with |
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
395 |
passwords in plain text. The idea behind such plain-text |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
396 |
passwords is of course that if the user typed in |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
397 |
\pcode{foobar} as password, we need to verify whether it |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
398 |
matches with the password that is already stored for this user |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
399 |
in the system. But doing this verification in plain text is |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
400 |
really a bad idea. Unfortunately, evidence suggests, however, |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
401 |
it is still a widespread practice. I leave you to think about |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
402 |
why verifying passwords in plain text is a bad idea. |
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
403 |
|
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
404 |
Using hash functions, like in our web-application, we can do |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
405 |
better. They allow us to not having to store passwords in |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
406 |
plain text for verification whether a password matches or not. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
407 |
We can just hash the password and store the hash-value. And |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
408 |
whenever the user types in a new password, well then we hash |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
409 |
it again and check whether the hash-values agree. Just like |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
410 |
in the web-application before. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
411 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
412 |
Lets analyse what happens when a hacker gets hold of such a |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
413 |
hashed password database. The hacker has then a list of user |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
414 |
names and associated hash-values, like |
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
415 |
|
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
416 |
\begin{center} |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
417 |
\pcode{urbanc:2aae6c35c94fcfb415dbe95f408b9ce91ee846ed} |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
418 |
\end{center} |
179
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
419 |
|
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
420 |
\noindent For a beginner-level hacker this information is of |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
421 |
no use. It would not work to type in the hash value instead of |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
422 |
the password, because it will go through the hashing function |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
423 |
again and then the resulting two hash-values will not match. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
424 |
One attack a hacker can try, however, is called a \emph{brute |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
425 |
force attack}. Essentially this means trying out exhaustively |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
426 |
all strings |
181
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
427 |
|
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
428 |
\begin{center} |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
429 |
\pcode{a}, |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
430 |
\pcode{aa}, |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
431 |
\pcode{...}, |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
432 |
\pcode{ba}, |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
433 |
\pcode{...}, |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
434 |
\pcode{zzz}, |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
435 |
\pcode{...} |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
436 |
\end{center} |
a736a0c324a3
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
180
diff
changeset
|
437 |
|
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
438 |
\noindent and so on, hash them and check whether they match |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
439 |
with the hash-values in the database. Such brute force attacks |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
440 |
are surprisingly effective. With modern technology (usually |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
441 |
GPU graphic cards), passwords of moderate length only needs |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
442 |
seconds or hours to be cracked. Well the only defence we have |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
443 |
is to make passwords longer and force users to use the whole |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
444 |
spectrum of letters and keys for passwords in order to make |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
445 |
the search space to big for an effective brute force attack. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
446 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
447 |
Unfortunately, clever hackers have another ace up their |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
448 |
sleeves. These are called \emph{dictionary attacks}. The idea |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
449 |
behind dictionary attack is the observation that only few |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
450 |
people are competent enough to use sufficiently strong |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
451 |
passwords. Most users (at least too many) use passwords like |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
452 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
453 |
\begin{center} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
454 |
\pcode{123456}, |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
455 |
\pcode{password}, |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
456 |
\pcode{qwerty}, |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
457 |
\pcode{letmein}, |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
458 |
\pcode{...} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
459 |
\end{center} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
460 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
461 |
\noindent So an attacker just needs to compile a list |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
462 |
as large as possible of such likely candidates of passwords |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
463 |
and also compute their hash-values. Now if the attacker |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
464 |
knows the hash-value of a password is |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
465 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
466 |
\begin{center} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
467 |
\pcode{5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
468 |
\end{center} |
179
1cacbe5c67cf
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
178
diff
changeset
|
469 |
|
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
470 |
\noindent then just a lookup in the dictionary will reveal |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
471 |
that the plain-text password was \pcode{password}. What is |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
472 |
good about this attack is that the dictionary can be |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
473 |
precompiled in the ``comfort of the hacker's home'' before an |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
474 |
actual attack is launched. It just needs sufficient storage |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
475 |
space, which nowadays is pretty cheap. A hacker might in this |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
476 |
way not be able to crack all passwords in our database, but |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
477 |
even being able to crack 50\% can be serious damage for a |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
478 |
large company (because then you have to think how to make |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
479 |
users to change their old passwords). And hackers are very |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
480 |
industrious in compiling these dictionaries: for example they |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
481 |
definitely include variations like \pcode{passw0rd} and also |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
482 |
includes rules that cover cases like \pcode{passwordpassword} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
483 |
or \pcode{drowssap} (password reversed). Historically, |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
484 |
compiling a list for a dictionary attack is not as simple as |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
485 |
it might seem. At the beginning only ``real'' dictionaries |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
486 |
were available (like the Oxford English Dictionary), but such |
183
6ed7c9b8b291
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
182
diff
changeset
|
487 |
dictionaries are not ``optimised'' for the purpose of passwords. |
182
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
488 |
The first real hard date was obtained when a company called |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
489 |
RockYou ``lost'' 32 Million plain-text password. With this |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
490 |
data of real-life passwords, dictionary attacks took off. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
491 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
492 |
These dictionary attacks can be prevented by using salts. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
493 |
Remember a hacker needs to use the most likely candidates |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
494 |
of passwords and calculate their has-value. If we add before |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
495 |
hashing a password with a random salt, like \pcode{mPX2aq}, |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
496 |
then the string \pcode{passwordmPX2aq} will almost certainly |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
497 |
not be in the dictionary. Like in the web-application in the |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
498 |
previous section a salt does not prevent us from verifying a |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
499 |
password. We just need to add the salt whenever the password |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
500 |
is typed in again. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
501 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
502 |
There is a question whether we should us a single random salt |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
503 |
for every password in our database. A single salt would |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
504 |
already make dictionary attacks considerably more difficult. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
505 |
It turns out, however, that in case of password databases |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
506 |
every password should get their own salt. This salt is |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
507 |
generated at the time when the password is first set. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
508 |
If you look at a Unix password file you will find entries like |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
509 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
510 |
\begin{center} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
511 |
\pcode{urbanc:$6$3WWbKfr1$4vblknvGr6FcDeF92R5xFn3mskfdnEn...:...} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
512 |
\end{center} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
513 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
514 |
\noindent where the first part is the login-name, followed |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
515 |
by a field \pcode{$6$} which specifies which hash-function |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
516 |
is used. After that follows the salt \pcode{3WWbKfr1} and |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
517 |
after that the hash-value that is stored for the password plus |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
518 |
salt. I leave it to you to figure out how the password |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
519 |
verification would need to work based on this data. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
520 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
521 |
There is a non-obvious benefit of using a separate salt for |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
522 |
each password. Recall that \pcode{123456} is a popular |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
523 |
password that is most likely used by several of your users |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
524 |
(especially if the database contains millions of entries). If |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
525 |
we use no salt or one global salt, all hash-values will be the |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
526 |
same for this password. So if a hacker is in the business of |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
527 |
cracking as much passwords as possible, then it is a good idea |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
528 |
to concentrate on those very popular passwords. This is not |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
529 |
possible if each password gets its own salt: since we assume |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
530 |
the salt is generated randomly, each version of \pcode{123456} |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
531 |
will be associated with a different hash-value. |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
532 |
|
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
533 |
Note another interesting point. The web-application from the |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
534 |
previous section was only secure when the salt was secret. In |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
535 |
the password case, this is not needed. The salt can be public |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
536 |
as shown above and is actually stored as part of the password |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
537 |
entry. Knowing the salt does not give the attacker any |
681e35f6b0e4
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
181
diff
changeset
|
538 |
advantage, but prevents that dictionaries can be precompiled. |
183
6ed7c9b8b291
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
182
diff
changeset
|
539 |
The moral is that you should never store passwords in plain |
6ed7c9b8b291
updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
182
diff
changeset
|
540 |
text. Never ever. |
174
e2180cead443
updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
173
diff
changeset
|
541 |
|
158
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
542 |
\end{document} |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
543 |
|
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
544 |
%%% Local Variables: |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
545 |
%%% mode: latex |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
546 |
%%% TeX-master: t |
702fea7754eb
added handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
547 |
%%% End: |