<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bryan Helmig &#187; snippets</title>
	<atom:link href="http://bryanhelmig.com/tag/snippets/feed/" rel="self" type="application/rss+xml" />
	<link>http://bryanhelmig.com</link>
	<description>...does nerdy things.</description>
	<lastBuildDate>Thu, 29 Mar 2012 16:18:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Django Encryption &#8211; An Updated How-To</title>
		<link>http://bryanhelmig.com/django-encryption/</link>
		<comments>http://bryanhelmig.com/django-encryption/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 05:56:10 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Boring Stuff]]></category>
		<category><![CDATA[AES]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[snippets]]></category>

		<guid isPermaLink="false">http://bryanhelmig.com/?p=213</guid>
		<description><![CDATA[I love Django, and I love Django Snippets, but I&#8217;ve noticed some snippets are out of date, most notably for me, Django snippet 1095 or Django Encryption. Unfortunately, some folks are hitting a few snags on TypeError: &#8220;Non-hexadecimal digit found&#8221;. Luckily, it seems that Django-Fields have solved this problem for us! Here is my (their) [...]]]></description>
			<content:encoded><![CDATA[<p>I love Django, and I love <a href="http://www.djangosnippets.org/">Django Snippets</a>, but I&#8217;ve noticed some snippets are out of date, most notably for me, Django snippet 1095 or <a href="http://www.djangosnippets.org/snippets/1095/">Django Encryption</a>. Unfortunately, some folks are hitting a few snags on TypeError: &#8220;Non-hexadecimal digit found&#8221;.</p>
<p>Luckily, it seems that <a href="http://github.com/svetlyak40wt/django-fields">Django-Fields</a> have solved this problem for us! Here is my (their) technique!</p>
<p>Make a file named encryption.py to go into the same folder as your settings.py containing:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">binascii</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">string</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> django <span style="color: #ff7700;font-weight:bold;">import</span> forms
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span> <span style="color: #ff7700;font-weight:bold;">import</span> settings
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> BaseEncryptedField<span style="color: black;">&#40;</span>models.<span style="color: black;">Field</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'This code is based on the djangosnippet #1095
You can find the original at http://www.djangosnippets.org/snippets/1095/'</span><span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        cipher = kwargs.<span style="color: black;">pop</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'cipher'</span>, <span style="color: #483d8b;">'AES'</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">imp</span> = <span style="color: #008000;">__import__</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Crypto.Cipher'</span>, <span style="color: #008000;">globals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">locals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#91;</span>cipher<span style="color: black;">&#93;</span>, -<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span> = <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">imp</span>, cipher<span style="color: black;">&#41;</span>.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span>settings.<span style="color: black;">SECRET_KEY</span><span style="color: black;">&#91;</span>:<span style="color: #ff4500;">32</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">prefix</span> = <span style="color: #483d8b;">'$%s$'</span> <span style="color: #66cc66;">%</span> cipher
&nbsp;
        max_length = kwargs.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'max_length'</span>, <span style="color: #ff4500;">40</span><span style="color: black;">&#41;</span>
        mod = max_length <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">block_size</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> mod <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
            max_length += <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">block_size</span> - mod
        kwargs<span style="color: black;">&#91;</span><span style="color: #483d8b;">'max_length'</span><span style="color: black;">&#93;</span> = max_length <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">2</span> + <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">prefix</span><span style="color: black;">&#41;</span>
&nbsp;
        models.<span style="color: black;">Field</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _is_encrypted<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>value, <span style="color: #008000;">basestring</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> value.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">prefix</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_padding<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        mod = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">block_size</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> mod <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">block_size</span> - mod
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> to_python<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>._is_encrypted<span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">decrypt</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">binascii</span>.<span style="color: black;">a2b_hex</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#91;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">prefix</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\0</span>'</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> value
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_db_prep_value<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> value <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>._is_encrypted<span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>:
            padding = <span style="color: #008000;">self</span>._get_padding<span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> padding <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
                value += <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>&quot;</span> + <span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">printable</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> index <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>padding-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            value = <span style="color: #008000;">self</span>.<span style="color: black;">prefix</span> + <span style="color: #dc143c;">binascii</span>.<span style="color: black;">b2a_hex</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">encrypt</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> value
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> EncryptedTextField<span style="color: black;">&#40;</span>BaseEncryptedField<span style="color: black;">&#41;</span>:
    <span style="color: #0000cd;">__metaclass__</span> = models.<span style="color: black;">SubfieldBase</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_internal_type<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'TextField'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> formfield<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        defaults = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'widget'</span>: forms.<span style="color: black;">Textarea</span><span style="color: black;">&#125;</span>
        defaults.<span style="color: black;">update</span><span style="color: black;">&#40;</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>EncryptedTextField, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">formfield</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">**</span>defaults<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> EncryptedCharField<span style="color: black;">&#40;</span>BaseEncryptedField<span style="color: black;">&#41;</span>:
    <span style="color: #0000cd;">__metaclass__</span> = models.<span style="color: black;">SubfieldBase</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_internal_type<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;CharField&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> formfield<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        defaults = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'max_length'</span>: <span style="color: #008000;">self</span>.<span style="color: black;">max_length</span><span style="color: black;">&#125;</span>
        defaults.<span style="color: black;">update</span><span style="color: black;">&#40;</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>EncryptedCharField, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">formfield</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">**</span>defaults<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>And then in your models.py:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> encryption <span style="color: #ff7700;font-weight:bold;">import</span> EncryptedCharField
...
<span style="color: #ff7700;font-weight:bold;">class</span> Example<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    secret = EncryptedCharField<span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> Meta:
        ordering = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'secret'</span>,<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">secret</span></pre></td></tr></table></div>

<p>This should be pretty explanatory! Have fun!</p>
<p><em>PS: You need PyCrypto! Google much?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://bryanhelmig.com/django-encryption/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

