so I have a database of information with encrypted customer names. When I use a plain python script to decrypt the names it works correctly and decrypts all of the customer names.
However, when I used Django it will decrypt only one name and the remaining names will still be encrypted.
I encrypt by salting my password key with a 256 bit sha has and then I use AES encryption on the data then i base 64 encode it and stick it into the db.
Regular Python Script:
def pad(string):
return string + ((16-len(string) % 16) * '{' )
password = hashlib.sha256("hidmykey").digest()
IV = 16 * '\x00'
mode = AES.MODE_CBC
decryptor = AES.new(password, mode, IV=IV)
config_values = metering_config('VMStats',['logfile','daemon', 'pguser','pgpassword','pghost','pgport']) #
postgres = psycopg2.connect(database='metering', user=config_values['pguser'], password=config_values['pgpassword'],host=config_values['pghost'], port=config_values['pgport'])
pg_cursor = postgres.cursor()
pg_cursor.execute("set timezone TO 'GMT'")
storage_cursor_pg = postgres.cursor()
customer_list = []
pg_cursor.execute(''' select customer_name, customer_id from customers''')
for customer_name, customer_id in pg_cursor:
data = base64.b64decode(customer_name)
plain = decryptor.decrypt(data)
lenofdec = plain.count('{')
customer_list.append((plain[:len(plain)-lenofdec], customer_id))
this works perfectly fine.
DJANGO
#these are functions django views calls to decrypt the data.
def pad(string):
return string + ((16-len(string) % 16) * '{' )
def show_name(customer_name):
password = hashlib.sha256("hidden").digest()
IV = 16 * '\x00'
mode = AES.MODE_CBC
decryptor = AES.new(password, mode, IV=IV)
data = base64.b64decode(customer_name)
enc_customer_name = decryptor.decrypt(data)
lenofdec = enc_customer_name.count('{')
customer_name = enc_customer_name[:len(enc_customer_name)-lenofdec]
return customer_name
The actual django page:
@login_required
def portal(request):
#define var's
customer_list = []
user = request.user
user_name = request.user.username
user.is_superuser = check_user(user, user_name) #my own custom function to do some Active Directory stuff.
if user.is_active and user.is_superuser:
customers = Customers.objects.all().order_by('customer_name')
else:
customers = Customers.objects.get(customer_id=customer_id_filter)
for customer in customers:
customer_name = show_name(str(customer.customer_name)) #ive tried with and without making it a string.
customer_list.append((customer_name, int(customer.customer_id)))
current_month = date.today().month
context = Context({'customer_list': customer_list,
'user.is_superuser':user.is_superuser,
'current_month':current_month,
})
return render(request, 'portal.html', context)
Here is the output:
as you see below ('TESTCUSTOMER', 81) is decrypted in real life that is a customer name that gets decrypted and its always the same name. However in my python script outside of django goes through them all and decrypts them.
[('\xa9\xdc\xbf\x86#\x7f4\xc7\xcc\xf1q\x8f3\xe2X\xf3', 26),
('\x8a\xbc\x16\x90\r-B\x7f\xabU\x1d]\xb9M\xc5\xe3', 142),
('g\x04\xa3aMk\xe49\xb7\xba\xf2Q4\xc6\xc6\xac', 25),
("\x92\xbbqA\x0fvE\x94S}\x01|\\BX'", 41),
('\x07\x9a\xe9\xb1G\\\x8e\xa0\xbe\x83A\x86/\xe5%\xb7', 101),
('a\xf4\x88\xc0H\xd3\x87\xe1\x05\x18\xe1X\xb8\xe6\xf3\xf3', 23),
('l\xe7\x9c\xd0\x0eOz\x8d\x85\x94\xeb\xd9\x1c\xc2\x08\xc8', 38),
('\xd0&\x88,T\xe2(\xac7\xbd\xaa\x90s\x17\xec\xae', 31),
('\x15"\xf3"\xaf[*\xa8\xe0\xb0;L\xb5\x98\x1a\xef', 30),
('6\x15$\xddH\xdbw\xef\x03\xec\x8bk,\xbc2\x8a', 32),
('\x1f\xf4\x08S\x1c\xa5\xf0\x11L\x1b\xbe\xe5Cq\xea3', 28),
('\xda\x99\xd6\xa8:3bc\x96\x90u\xca\xd3\xc1|L', 22),
('\xe3*\x9d\x95\x83\x8c\xe4O\x99\x03\x12\xd4\x87\x1f\xc1\xa7', 35),
(':\x8f\xbc#\x81g\xe5,fk\xca\x0b9\xca\x99&', 24), ('0
\t\xfb\xafAT\xae\x8d\x0cW\x86\xa2\xf9\x11\x8f', 21),
('\xce\xe3\x17^\xc5\xabI\x9aT\x80\xcaIm\xc4\xcaS', 36),
("tA\xe9\xe5S\x90z\xbcw'\x86\x17\x98\xab=[", 37),
("\\m\xf9e\xe9\xff\xe5X\xfa\xc9@\xc8'Jh\x81", 34),
('\x15)h\x12\x06\xc6\xfd\x86\xcd\x81\xfa\x10\xb6\xad\xbc\x9f', 121),
('TESTCUSTOMER', 81),
('\x15\x8b\x131\xd8\x1c\x04\xf7\x01\xb2\x8b\x84t\x11l\x07', 61),
('XU\xed+\xad*}\\L[M_\r$`\xc9', 141),
('l\xc7\xa3\xfc\xc6\xc3\xc5\xe6\xf3\x1ff\nq\x8d\x18"', 29),
('k\xb8/}Y\xbb\xf5\xe7`R8N(\x81pWy', 33),
('\x90\n\x07\xe8\xd2R6\x89L\xd8\xe5\x92\x95Q %', 1), ('\x92
\xad8|!\x82?\xa92\xc3\xe4\x8b7\xb4\x97', 27),
('1\xbd\x1c\xd1\xd0\xd1\xe7\x89\xa1\xcbKo\x16bW\x9e', 39)]