Solved

How do you decode with hmac?

Posted on 2010-11-23
5
2,321 Views
Last Modified: 2012-05-10
Hi,

How do you decode with hmac?
I can encode with this function below.. but decode function does not work

def hmac_encode(key, str):
     return hmac.new(key, str, hashlib.sha1).digest().encode('base64')[:-1]
def hmac_decode(key, str):
     return hmac.new(key, str, hashlib.sha1).digest().decode('base64')[:-1]

Thanks
Jamie

0
Comment
Question by:jamie_lynn
  • 3
  • 2
5 Comments
 
LVL 28

Assisted Solution

by:pepr
pepr earned 500 total points
ID: 34208895
Hi Jamie, hmac does something else than you expect It can take many kilobytes of the input string.  It returns a fixed lenght digest that is a kind of fingerprint of the input string.  This way, you can check whether (say) downloaded data (i.e. the input string) was not changed during the transmission.  You simply use the same algorithm and the same key and (hopefully) the same input string, and you have to get the same digest (the fingerprint).  If you get something else, then the data is not identical to what was sent.

In other way, it is a one-way function that returns a signature of the data.  It is not a kind of compression or reversable encoding.

The methods .encode() and .decode() do simply convert the string (bytes) signature to some other string.  You can also use .hexdigest() to have the signature expressed as nicely printable characters.

Try this:
import hashlib
import hmac

k = '0000'
s = 'xxxx string'
h = hmac.new(k, s, hashlib.sha1)
print h.digest()
print h.hexdigest()

Open in new window


See the funny characters as the result of .digest() -- the bytes are interpreted as characters by the print command.  The .hexdigest() shows what the bytes are -- each couple of hex digits describes one byte from the .digest(). It shows the following on my computer:

C:\tmp\_Python\jamie_lynn\Q_26635274>python a.py
cEG¦vë_¿wlÜ8u¿°UkW+l
9fb747b17689dcfa77889a38fbf4f8eb6b57bc88
0
 

Author Comment

by:jamie_lynn
ID: 34210847
Hi pepr,

Oh, then this isn't what i want. This works for password (encoding one way), but i am obfuscating my emails addresses too. So I need a way to decode the data.
What is a good way to enocde and decode emails in databases?

thanks
Jamie
0
 
LVL 28

Accepted Solution

by:
pepr earned 500 total points
ID: 34211028
You probably should search for encryption/decryption algorithms.  The standard documentation points indirectly to PyCrypto that can be downloaded from PyPI (see http://pypi.python.org/pypi/pycrypto/).  The homepage of the package is http://www.pycrypto.org/.  The principles (how to work with it) are described at http://www.dlitz.net/software/pycrypto/doc/.  You probably want to use one of the encryption algorithms (http://www.dlitz.net/software/pycrypto/doc/#crypto-cipher-encryption-algorithms).  There is a short example that uses DES algorithm -- it should be OK for you.  However, AES is more recommended these days.

Basically, there are two ways used to encrypt/decrypt the data.  The simpler one uses a single key (must be kept secret) that is used to both encrypt and then decrypt the message.  The more sofisticated uses two keys: one is used for encryption and the other for decryption. One of them may be made public, the other must be kept secret by the owner of the keys. The two approaches are often combined to get better performance.
0
 
LVL 28

Expert Comment

by:pepr
ID: 34211040
0
 

Author Closing Comment

by:jamie_lynn
ID: 34211056
Thanks pepr. I'll use the single key since my app is the only one encrypting and decrypting the data
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction On September 29, 2012, the Python 3.3.0 was released; nothing extremely unexpected,  yet another, better version of Python. But, if you work in Microsoft Windows, you should notice that the Python Launcher for Windows was introduced wi…
Strings in Python are the set of characters that, once defined, cannot be changed by any other method like replace. Even if we use the replace method it still does not modify the original string that we use, but just copies the string and then modif…
Learn the basics of strings in Python: declaration, operations, indices, and slicing. Strings are declared with quotations; for example: s = "string": Strings are immutable.: Strings may be concatenated or multiplied using the addition and multiplic…
Learn the basics of lists in Python. Lists, as their name suggests, are a means for ordering and storing values. : Lists are declared using brackets; for example: t = [1, 2, 3]: Lists may contain a mix of data types; for example: t = ['string', 1, T…

914 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now