如何使用pycrypto将RSA加密数据存储到postgresql?

时间:2011-10-27 10:16:38

标签: python postgresql rsa public-key-encryption pycrypto

我想使用公钥/私钥来保护我的UserInfo数据。我是PyCrypto和PostgreSQL的新手。

我有一些要澄清的事项:

  1. 公钥和私钥是否为常量值?
  2. 如果它是常数,我该如何正确存储?
  3. 最后但最重要的是,如何将加密数据存储到PostgreSQL?并检索它以进行验证?
  4. 您是否可以指导我如何处理Crypto.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)
    

    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
    
    # 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:\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: 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 个答案:

答案 0 :(得分:0)

您的问题是您正在尝试将二进制数据存储在文本文件中。尝试对数据进行装甲或使用bytea(使用正确的编码/解码)。