4 Stimmen

Wie speichert man RSA-verschlüsselte Daten in PostgreSQL unter Verwendung von PyCrypto?

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:

  1. Sind Public Key und Private Key konstante Werte?
  2. Wenn es konstant ist, wie kann ich es ordnungsgemäß speichern?
  3. 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)

0voto

Chris Travers Punkte 23990

Ihr Problem ist, dass Sie versuchen, binäre Daten in einer Textdatei zu speichern. Versuchen Sie, die Daten zu panzern oder verwenden Sie bytea (mit ordnungsgemäßer Codierung/Decodierung).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X