首页 文章

如何在GAE中保存RSA密钥

提问于
浏览
0

我生成一个RSA密钥:

random_generator  = Random.new().read
k1                = RSA.generate(1024,random_generator)

如果我从k1导出所有工作创建一个新密钥:

export             = k1.exportKey() 
k2                 = RSA.importKey(export)

如果我用k1加密并用k2解密,一切都很好 . 我想保存“export”然后用它来创建一个新密钥k3,这样我就可以用k1加密并用k3解密 . 到目前为止没有运气 . 这是我尝试过的:

class SavedKey(db.Model):
    k       =    db.BlobProperty()
r = SavedKey()
    r.k = export
    r.put()

我检索的内容不起作用:

retrieved =db.GqlQuery("Select * from SavedKey ").fetch(1000)[0]
retrieved = saved.k
k3 = RSA.importKey(retrieved)

“已检索”采用正确的私钥格式,但其 Value 与原始“导出”不同 . k3适用于加密和解密,但由k1加密当然不会用k3解密,这正是我想要实现的 .

我究竟做错了什么?

1 回答

  • 3

    你做错了是,你正在检索错误的实体 . 考虑到

    db.GqlQuery("Select * from SavedKey ").fetch(1000)[0]
    

    检索数据存储区中的 SavedKey 实体之一 SavedKey . 相反,如果你确定你检索从 export 构建的实际的那个(很难做到,因为你的 SavedKey 模型没有识别属性),一切都会正常工作 .

    这是一个例子(使用 ndb ,因为继续使用旧的 db 没有意义):

    class MainHandler(webapp2.RequestHandler):
        def get(self):
            random_generator = Random.new().read
            k1 = RSA.generate(1024, random_generator)
            export = k1.exportKey() 
    
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.write(export)
    
            r = SavedKey()
            r.k = export
            rk = r.put() 
    
            retrieved = rk.get().k
            self.response.write(retrieved)
            k3 = RSA.importKey(retrieved)
    
            encrypted = k1.encrypt('four score and seven years ago', 0)
            decrypted = k3.decrypt(encrypted)
            self.response.write('\n' + decrypted)
    

    ......这会很好用 .

相关问题