GridDB结合Python cryptography存储加密数据时类型错误咨询
GridDB中处理加密二进制数据的解决方案
问题根源
你遇到的TypeError是因为:Fernet加密生成的是bytes类型数据,但你用GridDB的STRING类型存储时,系统会自动将bytes转成字符串(默认UTF-8编码);检索时拿到的是str类型,而Fernet的decrypt()方法必须接收bytes类型参数,因此触发错误。
更合理的做法是用GridDB专门的BINARY类型存储加密二进制数据,而非STRING类型,这样能避免不必要的编码转换。
修复步骤
- 修改容器列类型:将
data列的类型从griddb.Type.STRING改为griddb.Type.BINARY - 存储数据:直接存入Fernet加密后的bytes数据,无需额外转换
- 检索数据:直接获取BINARY类型对应的bytes数据,传入
decrypt()方法即可
修正后的完整代码
from cryptography.fernet import Fernet import griddb_python as griddb # 生成加密密钥 key = Fernet.generate_key() cipher_suite = Fernet(key) # 加密示例数据 data = "Quantum Safe Data" encrypted_data = cipher_suite.encrypt(data.encode()) # 初始化GridDB连接 factory = griddb.StoreFactory.get_instance() try: gridstore = factory.get_store( host="localhost", port=10001, cluster_name="defaultCluster", username="admin", password="admin" ) container_name = "quantum_test" conInfo = griddb.ContainerInfo( name=container_name, column_info_list=[["id", griddb.Type.INTEGER], ["data", griddb.Type.BINARY]], # 改为BINARY类型 type=griddb.ContainerType.COLLECTION, row_key=True) container = gridstore.put_container(conInfo) container.set_auto_commit(False) # 存储加密数据(直接传入bytes) row = [1, encrypted_data] container.put_row(row) container.commit() # 检索并解密数据 query = container.query("select *") rs = query.fetch() while rs.has_next(): row = rs.next() # 直接用row[1](bytes类型)解密 decrypted_data = cipher_suite.decrypt(row[1]).decode() print("Decrypted Data:", decrypted_data) except griddb.GSException as e: print("GridDB Error:", e)
额外说明
GridDB的BINARY类型专为存储二进制数据设计,不会对数据进行任何编码或转换,能完整保留加密数据的原始字节结构,是存储加密内容、文件片段等二进制数据的最优选择。如果坚持使用STRING类型,也可以在存储时将bytes转成base64字符串,检索时再转回bytes,但这种方式会增加数据体积,不如直接用BINARY类型高效。
内容的提问来源于stack exchange,提问作者Hassan Ubaid
相关产品推荐
相关产品推荐

