1 | <html> |
2 | <!-- This code is provided under the terms of the Creative Commons |
3 | Â Â Â "Attribution (CC BY)"license. Please see |
4 | Â Â Â http://creativecommons.org/licenses/for details --> |
5 | <head> |
6 | Â Â Â <title>Client-side Encryption </title> |
7 | Â Â Â <script type="text/javascript"src="jquery-1.4.2.min.js"></script> |
8 | Â Â Â <script type="text/javascript"src="sha256.js"></script> |
9 | Â Â Â <script type="text/javascript"src="aes.js"></script> |
10 | Â Â Â <script type="text/javascript"> |
11 | Â Â Â //verification hash for passcode "passcode". |
12 | Â Â Â //this would be provided from the database. |
13 | Â Â Â var GLOBAL _verification _hash |
14 | Â Â Â Â Â Â Â Â Â = "a983169676c9fdcc852f29c013aef5f6faac345dfff472548bf93a543618d5ed"; |
15 |    var GLOBAL _passcode      =null; |
16 |    var GLOBAL _encryption _key   =null; |
17 | Â |
18 | Â Â Â /** |
19 | Â Â Â Â Â Â *assume that all encrypted fields start encrypted |
20 | Â Â Â Â Â Â */ |
21 | Â Â Â $(document).ready(function () { |
22 | Â Â Â Â Â Â $(".encrypted").each(function () { |
23 | Â Â Â Â Â Â Â Â Â $(this).attr("encryption _status", "encrypted"); |
24 | Â Â Â Â Â Â }); |
25 | Â Â Â }); |
26 | Â |
27 | Â Â Â /** |
28 | Â Â Â Â Â Â *get the passcode |
29 | Â Â Â Â Â Â */ |
30 | Â Â Â $(document).ready(function () { |
31 | Â Â Â Â Â Â if ($(".encrypted").length >0) { |
32 | Â Â Â Â Â Â Â Â Â try { |
33 | Â Â Â Â Â Â Â Â Â Â Â Â if (!GLOBAL _verification _hash) { |
34 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â throw "There is no verification hash available."; |
35 | Â Â Â Â Â Â Â Â Â Â Â Â } |
36 | Â |
37 | Â Â Â Â Â Â Â Â Â Â Â Â GLOBAL _passcode =prompt("Please enter your encryption passcode:", ""); |
38 | Â Â Â Â Â Â Â Â Â Â Â Â if (!GLOBAL _passcode) { |
39 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â throw "You did not enter an encryption passcode."; |
40 | Â Â Â Â Â Â Â Â Â Â Â Â } |
41 | Â |
42 | Â Â Â Â Â Â Â Â Â Â Â Â GLOBAL _encryption _key =SHA256.hex _sha256(GLOBAL _passcode); |
43 | Â |
44 | Â Â Â Â Â Â Â Â Â Â Â Â if (SHA256.hex _sha256(GLOBAL _encryption _key) !=GLOBAL _verification _hash) { |
45 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â throw "The passcode you entered does not verify. " |
46 | Â Â Â Â Â Â Â Â Â Â Â Â } |
47 | Â |
48 | Â Â Â Â Â Â Â Â Â Â Â Â decrypt _data(); |
49 | Â Â Â Â Â Â Â Â Â } |
50 | Â Â Â Â Â Â Â Â Â catch (error _message) { |
51 | Â Â Â Â Â Â Â Â Â Â Â Â $(".encrypted").attr("disabled","disabled"); |
52 | Â Â Â Â Â Â Â Â Â Â Â Â alert(error _message + "Encrypted fields will be disabled."); |
53 | Â Â Â Â Â Â Â Â Â } |
54 | Â Â Â Â Â Â } |
55 | Â Â Â }); |
56 | Â |
57 | Â Â Â /** |
58 | Â Â Â Â Â Â *on form submission, encrypt the data |
59 | Â Â Â Â Â Â */ |
60 | Â Â Â $(document).ready(function () { |
61 | Â Â Â Â Â Â $("#encryption _form").submit(function () { |
62 | Â Â Â Â Â Â Â Â Â encrypt _data(); |
63 | Â Â Â Â Â Â Â Â Â return true; |
64 | Â Â Â Â Â Â }); |
65 | Â Â Â }); |
66 | Â |
67 | Â Â Â /** |
68 | Â Â Â Â Â Â *find all encrypted encryptable fields and decrypt them. |
69 | Â Â Â Â Â Â *use Base64 to keep characters in the printable range. |
70 | Â Â Â Â Â Â */ |
71 | Â Â Â function decrypt _data () { |
72 | Â Â Â Â Â Â $(".encrypted[encryption _status=encrypted]").each(function () { |
73 | Â Â Â Â Â Â Â Â Â var encrypted _text = $(this).val(); |
74 | Â Â Â Â Â Â Â Â Â if (encrypted _text != "") { |
75 | Â Â Â Â Â Â Â Â Â Â Â Â var plain _text =AesCtr.decrypt(Base64.decode(encrypted _text), |
76 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â GLOBAL _encryption _key, 256); |
77 | Â Â Â Â Â Â Â Â Â Â Â Â $(this).val(plain _text); |
78 | Â Â Â Â Â Â Â Â Â } |
79 | Â Â Â Â Â Â Â Â Â $(this).attr("encryption _status", "decrypted"); |
80 | Â Â Â Â Â Â }); |
81 | Â Â Â } |
82 | Â |
83 | Â Â Â /** |
84 | Â Â Â Â Â Â *find all decrypted encryptable fields and encrypt them. |
85 | Â Â Â Â Â Â *use Base64 to keep characters in the printable range. |
86 | Â Â Â Â Â Â */ |
87 | Â Â Â function encrypt _data () { |
88 | Â Â Â Â Â Â $(".encrypted[encryption _status=decrypted]").each(function () { |
89 | Â Â Â Â Â Â Â Â Â var plain _text = $.trim($(this).val()); |
90 | Â Â Â Â Â Â Â Â Â if (plain _text != "") { |
91 | Â Â Â Â Â Â Â Â Â Â Â Â var encrypted _text =Base64.encode(AesCtr.encrypt(plain _text, |
92 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â GLOBAL _encryption _key, 256)); |
93 | Â Â Â Â Â Â Â Â Â Â Â Â $(this).val(encrypted _text); |
94 | Â Â Â Â Â Â Â Â Â } |
95 | Â Â Â Â Â Â Â Â Â $(this).attr("encryption _status", "encrypted"); |
96 | Â Â Â Â Â Â }); |
97 | Â Â Â } |
98 | Â |
99 | Â Â Â </script> |
100 | </head> |
101 | <body> |
102 | Â Â Â <form id="encryption _form"> |
103 | Â Â Â Â Â Â Encrypted: <input type="text" |
104 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â name="enc _field" |
105 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â id="enc _field" |
106 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â value="TkVjM1RENCtQajR6ZUIzZktRY0VrdndQVTB6Q091akQvTHpjeVE9PQ==" |
107 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â class="encrypted"/><br/> |
108 | Â Â Â Â Â Â Unencrypted: <input type="text" |
109 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â name="field" |
110 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â id="field" |
111 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â value="some unencrypted value" |
112 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â class=""/><br/> |
113 | Â Â Â Â Â Â <input type="submit"value="Encrypt and submit"/> |
114 | Â Â Â </form> |
115 | </body> |
116 | </html> |