Ich möchte den Public/Private-Schlüssel verwenden, um meine UserInfo-Daten zu sichern. Ich bin neu in PyCrypto und PostgreSQL.
Ich habe einige Punkte zu klären:
- Sind Public Key und Private Key konstante Werte?
- Wenn es konstant ist, wie kann ich es ordnungsgemäß speichern?
- Zuletzt, aber am wichtigsten, wie kann ich meine verschlüsselten Daten in PostgreSQL speichern und zur Überprüfung abrufen?
Könnten Sie mich darüber informieren, wie ich Crypto.PublicKey.RSA als Methode zur Sicherung meiner Daten verwenden kann.
Umgebung: Python 2.5, PyCrypto 2.3, PostgreSQL 8.3 UTF-8 Kodierung
UserInfo-Modell:
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)
UPDATES1 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
# Einrichten von 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
# Erstelle RSA-Objekt mit zufälligem Schlüssel
# 1024 Bit
#rsa = Crypto.PublicKey.RSA.generate(1024, pool.get_bytes)
rsa = Crypto.PublicKey.RSA.generate(1024, rng)
# Den öffentlichen Schlüssel abrufen
pub_rsa = rsa.publickey()
# RSA-Objekt durch Tupel erstellen
# rsa.n ist der öffentliche Schlüssel?, rsa.d ist der private Schlüssel?
priv_rsa = Crypto.PublicKey.RSA.construct((rsa.n, rsa.e, rsa.d))
# Verschlüsselung
enc = pub_rsa.encrypt("hallo", "")
# Entschlüsselung
dec = priv_rsa.decrypt(enc)
print "privat: 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 "öffentlich: n=%d, e=%d" % (pub_rsa.n, pub_rsa.e)
print "verschlüsseln:", enc
print "entschlüsseln:", dec
# Zu signierender Text
text = "hallo"
signatur = priv_rsa.sign(text, "")
# Überprüfen, ob der Text sich nicht geändert hat
print pub_rsa.verify(text, signatur)
print pub_rsa.verify(text+"a", signatur)
# userid = models.TextField(primary_key = True)
# password = models.TextField(null = True)
# keyword = models.TextField(null = True)
# key = models.TextField(null = True, blank = True) ist es korrekt, den öffentlichen Schlüssel hier zu speichern?
# date = models.DateTimeField(null = True, blank = True)
userInfo = UserInfo(userid='test1', password=enc[0], key=pub_rsa.n)
userInfo.save()
print "ok"
Ergebnis hier (fehlgeschlagen):
======================================================================
ERROR: test_001_registerUserInfo (py23.service.auth.tests.AuthenticationTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\PIDevelopment\workspace37_pydev\pyh23\py23\service\auth\tests.py", line 64, in test_001_registerUserInfo
userInfo.save()
File "C:\Python25\lib\site-packages\django\db\models\base.py", line 458, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "C:\Python25\lib\site-packages\django\db\models\base.py", line 551, in save_base
result = manager._insert(values, return_id=update_pk, using=using)
File "C:\Python25\Lib\site-packages\django\db\models\manager.py", line 195, in _insert
return insert_query(self.model, values, **kwargs)
File "C:\Python25\lib\site-packages\django\db\models\query.py", line 1524, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "C:\Python25\lib\site-packages\django\db\models\sql\compiler.py", line 788, in execute_sql
cursor = super(SQLInsertCompiler, self).execute_sql(None)
File "C:\Python25\lib\site-packages\django\db\models\sql\compiler.py", line 732, in execute_sql
cursor.execute(sql, params)
File "C:\Python25\lib\site-packages\django\db\backends\util.py", line 15, in execute
return self.cursor.execute(sql, params)
File "C:\Python25\lib\site-packages\django\db\backends\postgresql_psycopg2\base.py", line 44, in execute
return self.cursor.execute(query, args)
DatabaseError: ungültige Byte-Sequenz für Codierung "UTF8": 0x97
HINWEIS: Dieser Fehler kann auch auftreten, wenn die Byte-Sequenz nicht mit der vom Server erwarteten Codierung übereinstimmt, die von "client_encoding" kontrolliert wird.
----------------------------------------------------------------------
Ran 1 test in 90.047s
FAILED (errors=1)