#python #postgresql #rsa #public-key-encryption #pycrypto
#python #postgresql #rsa #шифрование с открытым ключом #pycrypto
Вопрос:
Я хочу использовать открытый / закрытый ключ для защиты моих данных userInfo. Я новичок в PyCrypto и PostgreSQL.
Мне нужно уточнить некоторые вопросы:
- Являются ли значения открытого и закрытого ключей постоянными?
- Если он постоянный, как я могу сохранить его правильно?
- Наконец, но самое главное, как я могу сохранить свои зашифрованные данные в PostgreSQL? и получить его для проверки?
Не могли бы вы рассказать мне, как обращаться с криптографией.PublicKey.RSA как метод защиты моих данных.
Среда: Python 2.5, PyCrypto 2.3, PostgreSQL 8.3 в кодировке UTF-8
Модель userInfo:
class UserInfo(models.Model):
userid = models.TextField(primary_key = True)
password = models.TextField(null = True)
keyword = models.TextField(null = True)
key = models.TextField(null = True, blank = True)
date = models.DateTimeField(null = True, blank = True)
ОБНОВЛЕНИЕ1
tests.py:
# -*- encoding:utf-8 -*-
import os
from os.path import abspath, dirname
import sys
from py23.service.models import UserInfo
from Crypto import Random
# Set up django
project_dir = abspath(dirname(dirname(__file__)))
sys.path.insert(0, project_dir)
os.environ['DJANGO_SETTINGS_MODULE'] = 'py23.settings'
from django.test.testcases import TestCase
class AuthenticationTestCase(TestCase):
def test_001_registerUserInfo(self):
import Crypto.PublicKey.RSA
import Crypto.Util.randpool
#pool = Crypto.Util.randpool.RandomPool()
rng = Random.new().read
# craete RSA object by random key
# 1024bit
#rsa = Crypto.PublicKey.RSA.generate(1024, pool.get_bytes)
rsa = Crypto.PublicKey.RSA.generate(1024, rng)
# retrieve public key
pub_rsa = rsa.publickey()
# create RSA object by tuple
# rsa.n is public key?, rsa.d is private key?
priv_rsa = Crypto.PublicKey.RSA.construct((rsa.n, rsa.e, rsa.d))
# encryption
enc = pub_rsa.encrypt("hello", "")
# decryption
dec = priv_rsa.decrypt(enc)
print "private: n=%d, e=%d, d=%d, p=%d, q=%d, u=%d" % (rsa.n, rsa.e, rsa.d, rsa.p, rsa.q, rsa.u)
print "public: n=%d, e=%d" % (pub_rsa.n, pub_rsa.e)
print "encrypt:", enc
print "decrypt:", dec
# text to be signed
text = "hello"
signature = priv_rsa.sign(text, "")
# check if the text has not changed
print pub_rsa.verify(text, signature)
print pub_rsa.verify(text "a", signature)
# userid = models.TextField(primary_key = True)
# password = models.TextField(null = True)
# keyword = models.TextField(null = True)
# key = models.TextField(null = True, blank = True) is it correct to store the public key here?
# date = models.DateTimeField(null = True, blank = True)
userInfo = UserInfo(userid='test1', password=enc[0], key=pub_rsa.n)
userInfo.save()
print "ok"
результат здесь (сбой):
======================================================================
ERROR: test_001_registerUserInfo (py23.service.auth.tests.AuthenticationTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:PIDevelopmentworkspace37_pydevpyh23py23serviceauthtests.py", line 64, in test_001_registerUserInfo
userInfo.save()
File "C:Python25libsite-packagesdjangodbmodelsbase.py", line 458, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "C:Python25libsite-packagesdjangodbmodelsbase.py", line 551, in save_base
result = manager._insert(values, return_id=update_pk, using=using)
File "C:Python25Libsite-packagesdjangodbmodelsmanager.py", line 195, in _insert
return insert_query(self.model, values, **kwargs)
File "C:Python25libsite-packagesdjangodbmodelsquery.py", line 1524, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "C:Python25libsite-packagesdjangodbmodelssqlcompiler.py", line 788, in execute_sql
cursor = super(SQLInsertCompiler, self).execute_sql(None)
File "C:Python25libsite-packagesdjangodbmodelssqlcompiler.py", line 732, in execute_sql
cursor.execute(sql, params)
File "C:Python25libsite-packagesdjangodbbackendsutil.py", line 15, in execute
return self.cursor.execute(sql, params)
File "C:Python25libsite-packagesdjangodbbackendspostgresql_psycopg2base.py", line 44, in execute
return self.cursor.execute(query, args)
DatabaseError: invalid byte sequence for encoding "UTF8": 0x97
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
----------------------------------------------------------------------
Ran 1 test in 90.047s
FAILED (errors=1)
Комментарии:
1. Переменные
signature
и, вероятноenc[0]
, являются байтами. Чтобы сделать их более «читаемыми», используйтеenc[0].encode('base64')
для хранения иenc[0].decode('base64')
извлечения.
Ответ №1:
Ваша проблема заключается в том, что вы пытаетесь сохранить двоичные данные в текстовом файле. Попробуйте защитить данные или использовать bytea (с правильным кодированием / декодированием).