天道酬勤,学无止境

iOS Swift 3 中的 SharkORM 加密属性问题(SharkORM Encrypted properties issue in iOS Swift 3)

问题

我正在使用 DB 处理 iOS 项目,我正在使用 SharkORM 并使用可可豆荚将其集成到我的项目中,我的项目是使用 Swift 3 构建的。

一切正常,但现在我需要向数据库添加加密值,为了测试它,我添加了一个非常简单的代码,

我创建了一个“用户”类,在其中定义了一个“测试”属性,该属性的类型为 Double:

dynamic var test: Double = 0;

我还在类中添加了以下代码以将“test”定义为加密属性:

override class func encryptedPropertiesForClass() -> [Any]! {
        return ["test"]
}

为了读/写这个属性,我做了以下事情:

print(User.currentUser.test)
User.currentUser.test = 10
User.currentUser.commit()
print(User.currentUser.test)

请注意当前用户是一个单例实例,它正在从数据库中读取。 但是,我收到以下异常:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[SRKEncryptedObject doubleValue]:无法识别的选择器发送到实例

知道为什么会这样吗? 提前致谢。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • SharkORM Encrypted properties issue in iOS Swift 3
    I'm working on iOS project with DB, I am using SharkORM and integrate it to my project using cocoa pods, my project is built using Swift 3. Everything is working perfectly, but now I need to add encrypted values to the DB and in order to test it I added a very simple code, I created a "User" class in which I defined a "test" property, this property is of type Double: dynamic var test: Double = 0; I also added the following code to the class to define "test" as encrypted property: override class func encryptedPropertiesForClass() -> [Any]! { return ["test"] } in order to read/write this
  • iOS Swift import data from .sql file to existing SQLite database
    I'm using SharkORM in my iOS Swift 3 app, what I'm trying to do is to import data to my SQLite database from a SQL script file, using the function: SharkORM.rawQuery("INSERT INTO `Unit` (Id,name,symbol) VALUES (1,'kg/m²','kg/m²')") However, I'm not able to add any record to my "Unit" table because I'm always getting the following error: unrecognized token: \"\'k/gm²\"" Anyone know why this could be happening? and if there is another way to import .sql file to my database even if not using SharkORM. Thanks in advance.
  • 如何在 IOS 和 android 中使用跨平台加密方法(仅限 AES 加密..)?(How do I do a cross platform encryption method working in both IOS and android (AES encryption only..)?)
    问题 我最近被分配了一项任务,即加密我在 swift 中传入 dataTaskWithRequest 的链接和参数。 主要的头痛是它应该产生与 Android 平台相同的输出。 android 团队已经创建了一个使用 spring 解密数据的后端。 java代码是这样的 AESencrp 类 { private static final String ALGO = "AES"; private static final byte[] keyValue = new byte[]{'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'}; public static String encrypt(String Data) throws Exception { Key key = generateKey(); Cipher c = Cipher.getInstance(ALGO); c.init(Cipher.ENCRYPT_MODE, key); byte[] encVal = c.doFinal(Data.getBytes()); String encryptedValue = new BASE64Encoder().encode(encVal); return
  • 序列化对象时如何加密选定的属性?(How can I encrypt selected properties when serializing my objects?)
    问题 我正在使用JSON在我的应用程序中存储某些设置。 一些设置包含敏感信息(例如密码),而其他设置则不敏感。 理想情况下,我希望能够序列化对敏感属性进行自动加密的对象,同时保持对非敏感设置的可读性。 有没有办法使用Json.Net做到这一点? 我没有看到与加密有关的任何设置。 回答1 Json.Net没有内置加密。 如果您希望能够在序列化过程中进行加密和解密,则需要编写一些自定义代码。 一种方法是将自定义的IContractResolver与IValueProvider结合使用。 值提供程序为您提供了一个钩子,您可以在其中进行序列化过程中的值转换,而合同解析器则使您可以控制何时以及在何处应用值提供程序。 在一起,他们可以为您提供所需的解决方案。 下面是您需要的代码示例。 首先,您会注意到我已经定义了一个新的[JsonEncrypt]属性; 这将用于指示您要加密的属性。 EncryptedStringPropertyResolver类扩展了Json.Net提供的DefaultContractResolver 。 我重写了CreateProperties()方法,以便可以检查由基本解析器创建的JsonProperty对象,并将我的自定义EncryptedStringValueProvider的实例附加到应用了[JsonEncrypt]属性的任何字符串属性。
  • 快速的 AES128 加密(AES128 encryption in swift)
    问题 我有 AES-128 加密的问题。 iOS 中的加密字符串与 Android 不同。 下面是安卓代码: public class Encryption { private static final String ALGORITHM = "AES"; private static final String UNICODE_FORMAT = "UTF8"; public static String encryptValue(String valueToEnc) { try { Key key = generateKey(); Cipher c = Cipher.getInstance(ALGORITHM); c.init(Cipher.ENCRYPT_MODE, key); byte[] encValue = c.doFinal(valueToEnc.getBytes()); String encryptedValue = new Base64().encode(encValue); String urlEncodeddata = URLEncoder.encode(encryptedValue, "UTF-8"); return urlEncodeddata; } catch (Exception e) { } return valueToEnc; } private
  • 在java中加密和解密属性文件值(encrypt and decrypt property file value in java)
    问题 我正在寻找一种方法来加密 Java 程序正在读取的配置文件中的密码。 目前,我从文本文件中读入了密码,但是如果有人要查看配置文件,那么密码就会处于公开状态。 我正在考虑构建一个简单的类,用户可以在其中输入所需的密码,获取密码的加密版本,然后将加密版本粘贴到配置文本文件中。 然后应用程序将读取加密的密码,将密码解密回字符串,然后继续。 我在字符串--> 加密字节--> 字符串转换方面遇到问题。 我正在使用内置的 java 安全类来实现此代码。 下面是一些示例测试代码: // Reads password from config file String password = ScriptConfig.getString( "password" ); // Generate Key KeyGenerator kg = KeyGenerator.getInstance("DES"); Key key = kg.generateKey(); // Create Encryption cipher Cipher cipher = Cipher.getInstance( "DES" ); cipher.init( Cipher.ENCRYPT_MODE, key ); // Encrypt password byte[] encrypted = cipher.doFinal(
  • 加密配置文件中的密码? [关闭](Encrypt Password in Configuration Files? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 3年前关闭。 改善这个问题 我有一个程序可以从配置文件中读取服务器信息,并希望在该配置中对密码进行加密,该密码可以由我的程序读取并解密。 要求: 加密要存储在文件中的纯文本密码解密从我的程序从文件读取的加密密码 关于我将如何执行此操作的任何建议? 我当时在考虑编写自己的算法,但我认为这绝对是不安全的。 回答1 一种简单的方法是在Java中使用基于密码的加密。 这使您可以使用密码来加密和解密文本。 这基本上意味着使用算法"AES/CBC/PKCS5Padding"初始化javax.crypto.Cipher ,并使用"PBKDF2WithHmacSHA512"算法从javax.crypto.SecretKeyFactory获取密钥。 这是一个代码示例(已更新以替换不太安全的基于MD5的变体): import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.AlgorithmParameters; import java.security.GeneralSecurityException; import java
  • 如何在Apache BasicDataSource中使用加密密码?(How to use encrypted password in apache BasicDataSource?)
    问题 目前,我将密码[未加密]保留在属性文件中。 使用ant将该密码原样放置在配置xml中。 [配置xml用于数据源,它正在创建dbcp.BasicDataSource的对象] 现在,是否有可能在ant目标之后以加密形式复制密码。 听说Jasypt可以做到! 直到现在我还没有尝试过。 但是,问题不止于此。 BasicDataSource不接受加密的密码。 是否可以替代BasicDatasource。 仅供参考:如果这很重要,我正在使用Spring。 回答1 使用Spring,有一种更好的方法:使用PropertyPlaceholderConfigurer类。 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:com/foo/jdbc.properties</value> </property> <property name="propertiesPersister"> <bean class="com.mycompany.MyPropertyPersister" /> </property> </bean> <bean id="dataSource" destroy
  • 通过 spring 自动配置在 spring boot 应用程序中使用加密密码进行数据库连接(Using encrypted password for database connection in spring boot application through spring auto configuration)
    问题 尝试使用加密的数据库密码使用 spring 自动配置连接到数据库 我正在使用 Spring 自动配置连接到数据库。 为此,我在属性文件中添加了以下属性: spring.datasource.url=jdbc:oracle:thin:@ABCDE2D.com:1888:ABCDE2D1 spring.datasource.username=user spring.datasource.password=password spring.datasource.driver-class-oracle.jdbc.driver.OracleDriver 在我的 dao 类中,我有 @Autowired NamedParameterJdbcTemplate 并直接使用它从数据库中获取数据。 直到这里它工作正常。 现在我需要加密属性文件中的密码。 为此,我做了以下工作: 在 pom 中添加了 jasypt-spring-boot-starter 在属性文件中添加 spring.datasource.password=ENC(NoIv2c+WQYF3LenN0tDYPA==) 在属性文件中添加了 jasypt.encryptor.password=key 现在我收到以下错误: Failed to bind properties under 'spring.datasource.password
  • Ember 数据转换中的访问控制器属性(Access controller properties within Ember Data Transform)
    问题 我喜欢访问 Ember Data Transform 中的控制器属性。 有没有办法做到这一点? 也许对我的用例说几句。 我喜欢创建一个自定义属性 'encryptedStrings' 并使用 DS.Transform 通过使用斯坦福 Javascript 加密库使用给定的密钥加密/解密字符串。 键应该在 uri 中作为查询参数的一部分。 get 方法在 DS.Transform 中定义,但我没有进一步了解。 这里是代码的相关部分: App.EncryptedStringTransform = DS.Transform.extend({ deserialize: function(serialized) { var key = this.get('pollController.encryptionKey'); return Ember.isNone(serialized) ? null : String( sjcl.decrypt( key , serialized) ); }, serialize: function(deserialized) { var key = this.get('pollController.encryptionKey'); return Ember.isNone(deserialized) ? null : String( sjcl.encrypt
  • AES加密和解密(AES Encrypt and Decrypt)
    问题 我迅速编写了一个应用程序,我需要AES加密和解密功能,我从另一个.Net解决方案中接收了加密数据,但是我找不到解决办法。 这是我的.net加密: public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes) { byte[] encryptedBytes = null; byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; using (MemoryStream ms = new MemoryStream()) { using (RijndaelManaged AES = new RijndaelManaged()) { AES.KeySize = 256; AES.BlockSize = 128; var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); AES.Key = key.GetBytes(AES.KeySize / 8); AES.IV = key.GetBytes(AES.BlockSize / 8); AES.Mode = CipherMode.CBC; using (var cs = new CryptoStream(ms
  • 与目标 C 相比,Swift SHA256 加密返回不同的加密字符串(Swift SHA256 encryption returns different encrypted string compare to Objective C)
    问题 我正在将一些代码从目标 c 迁移到 swift。 我想在 swift 中使用 SHA 256 算法使用密钥加密字符串。 但是与 Objective C 实现相比,swift 代码返回不同的加密字符串。 两个代码看起来一样,只是语法不同。 有人可以帮助我快速获得与过去在 Objective C 中相同的结果吗? 以下是两种语言的代码示例。 目标 C: NSString* key = @"1234567890123456789012345678901234567890123456789012345678901234"; const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; const char *cData = [@"message" cStringUsingEncoding:NSASCIIStringEncoding]; unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); NSData *hash = [[NSData alloc] initWithBytes:cHMAC length:sizeof
  • MD5 3DES 加密 Swift(MD5 3DES encryption Swift)
    问题 我有一个应用程序必须发送首先由 MD5 加密然后由 3DES 加密的登录凭据。 我已经设法使用 CryptoSwift 通过 MD5 加密字符串。 但是我在 Swift 上找不到任何可以通过 3DES 加密的东西。 我尝试过 CommonCrypto。 据我所知,这是在 C 中,但可以通过桥接头导入到 Objective C 中。 我找到了一些文章和教程,它们告诉我如何通过桥接头(带有警告它不适用于框架)或 Model.map 将 CommonCrypto 导入 Swift。 然而,两者都不起作用。 我不确定这是否是最新版本的 iOS 或 Xcode 的限制。 有人可以建议替代方案吗? 谢谢 已编辑 您好,请参阅我已采取的以下步骤 好的,所以我创建了一个名为 newEncrypt 的新项目。 我选择不使用标题选项,因为说明说这仅限于非框架应用程序/ 我在 newEncrypt 中创建了一个名为 CommonCrypto 的文件夹,里面有一个 module.map 文件。 其中的内容是: module CommonCrypto [system] { header "/usr/include/CommonCrypto/CommonCrypto.h" export * } 将 ${SRCROOT}/CommonCrypto 添加到 swift 编译器搜索路径导入路径。 调试和发布。
  • JWT在python中加密有效负载? (JWE)(JWT encrypting payload in python? (JWE))
    问题 根据 RFC 7516,应该可以加密负载/声明,称为 JWE。 有没有支持它的python库? 我已经检查过 PyJWT、python-jose 和 jwcrypto,但它们都只有使用HS256 (JWS) 签名的示例。 对不起,如果这完全是显而易见的,但是当涉及到加密的事情时,我会格外谨慎。 回答1 Jose 和 jwcrypto 库都可以做 JWE。 对于何塞: claims = { 'iss': 'http://www.example.com', 'sub': 42, } pubKey = {'k':\ '-----BEGIN PUBLIC KEY-----\n\ -----END PUBLIC KEY-----' } # decrypt on the other end using the private key privKey = {'k': '-----BEGIN RSA PRIVATE KEY-----\n'+\ '-----END RSA PRIVATE KEY-----' } encJwt = jose.encrypt(claims, pubKey) serJwt = jose.serialize_compact(encJwt) decJwt = jose.decrypt(jose.deserialize_compact(serJwt), privKey)
  • 在属性文件中保护密码[重复](Securing a password in a properties file [duplicate])
    问题 这个问题已经在这里有了答案: 加密配置文件中的密码? [已关闭] (10个答案) 3年前关闭。 我有一个连接数据库的Java应用程序。 数据库的用户名和密码存储在属性文件中。 避免在属性文件中以明文形式存储密码,同时仍保留允许用户更改它的选项,这是常见的做法? 这里的主要动机是防止在管理员编辑属性文件时有人看着管理员的肩膀并看到密码。 我在这里读到,有一种内置的方法可以用C#来完成。 了解Java,我不希望找到内置的解决方案,但我想听听其他人在做什么。 如果找不到任何好的选择,那么我可能会使用将保留在代码中的恒定密码对其进行加密。 但是我不喜欢这样做,因为它感觉不对。 编辑2012年12月12日看起来没有魔法,我必须将密码存储在代码中或类似的内容中。 最后,我们实现了与答案之一中提到的Jasypt非常相似的东西。 所以我接受Jasypt答案,因为它是最接近确定答案的东西。 回答1 Jasypt提供了org.jasypt.properties.EncryptableProperties类,用于加载,管理和透明地解密.properties文件中的加密值,从而允许在同一文件中混合使用加密和未加密的值。 http://www.jasypt.org/encrypting-configuration.html 通过使用org.jasypt.properties
  • springboot整合jasypt进行配置加密
    一、阿波罗使用Jasypt加密数据- 集成 步骤 1、添加依赖 (注意springboot 低于2.0版本, 使用响应的版本) com.github.ulisesbocchio jasypt-spring-boot-starter 2.1.2 2、配置加密秘钥,三种方式 2.1 、application.properties 中添加属性文件 jasypt.encryptor.password=TESTaiunlv85I3p1nXI41JMYoaxBAKK1 但是这种方式硬编码了,不利于项目发布,环境切换 2.2、使用阿波罗配置几种环境,但是这种不方便encrypt 、decrypt 接口利用加密秘钥 生成不同环境的加密字符 , 因为不同环境,有可能项目启动不起来。 针对不同环境可以配置不同的encrypt password 例: 开发环境: DEVTaiunlv85I3p1nXI41JMYoaxBAKK1 测试环境: TESTaiunlv85I3p1nXI41JMYoaxBAKK1 生产环境: PRODbiunlv85I3p1nXI41JMYoaxBAKK1 2.3、使用启动参数,使用这种方式,application.properties 不需要配置jasypt.encryptor.password 属性 , 否则会报错org.jasypt.exceptions
  • 如何在Java中使用我的密码对String进行加密和解密(PC不是移动平台)? [复制](How to encrypt and decrypt String with my passphrase in Java (Pc not mobile platform)? [duplicate])
    问题 这个问题已经在这里有了答案: 基于Java 256位AES密码的加密(9个答案) 去年关闭。 我想加密一个字符串,然后将其放在文件中。 我也想在需要时解密它。 我不需要非常强大的安全性。 我只是想让他人更难获得我的数据。 我尝试了几种方法。 这些是。 Md5加密: 如何在Android中对字符串进行哈希处理? public static final String md5(final String toEncrypt) { try { final MessageDigest digest = MessageDigest.getInstance("md5"); digest.update(toEncrypt.getBytes()); final byte[] bytes = digest.digest(); final StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { sb.append(String.format("%02X", bytes[i])); } return sb.toString().toLowerCase(); } catch (Exception exc) { return ""; // Impossibru! } } 我尝试了此功能并能够加密字符串
  • SWIFT - 领域数据库加密不起作用(SWIFT - Realm db encryption not working)
    问题 我正在尝试加密存储在领域数据库中的数据。 我遵循了 Realm 的 Swift 页面上提到的示例代码。 我想加密数据而不是数据库文件。 下面是我正在使用的代码: var error: NSError? = nil let configuration = Realm.Configuration(encryptionKey: EncryptionManager().getKey()) if let realmE = Realm(configuration: configuration, error: &error) { // Add an object realmE.write { realmE.add(objects, update: T.primaryKey() != nil) } } 其中对象是我需要插入数据库的对象列表。 下面是同样从示例代码中选取的 getKey() func 的代码: func getKey() -> NSData { // Identifier for our keychain entry - should be unique for your application let keychainIdentifier = "io.Realm.test" let keychainIdentifierData = keychainIdentifier
  • 使用 AES 加密和解密图像的正确方法(Correct way of Encrypting and Decrypting an Image using AES)
    问题 编辑:::问题中的代码有效,但是一旦在相机中拍摄图像,大约需要 10 秒才能返回活动。 我放弃了这种方法,并使用 Facebook 的隐藏库来加密和解密图像。 链接到 Facebook 的解决方案:Facebook Conceal - 图像加密和解密 我看过很多例子,但仍然无法找到正确的加密和解密方法。 当我在互联网上使用一些随机代码时,我认为我是正确的,但是在解码时,我得到了一个 BadPadding 异常。 所以,我正在努力解决这个问题。 正如大多数人所建议的那样,我正在关注以下问题(但此代码显示了如何加密字符串)。 有人可以帮我加密和解密图像吗? 问题中的代码适用于图像吗? 问题链接:Java 256-bit AES Password-Based Encryption 这是我到目前为止所做的: //全局数组列表来存储iv和密码 static ArrayList<byte[]> ivandcipher = new ArrayList<byte[]>(); //生成密钥 public static SecretKey generateKey() throws NoSuchAlgorithmException { char[] password = { 'a', 'b', 'c', 'd', 'e' }; byte[] salt = { 1, 2, 3, 4, 5 }
  • NSFetchedResultsController 未对加密属性进行排序(NSFetchedResultsController not sorting on encrypted attributes)
    问题 我正在尝试使用可转换类型对核心数据模型中的属性进行加密,但是在将数据持久保存到 sqlite 数据库后尝试取回结果时遇到了很多问题。 我对 Core Data 的主要应用是存储一些与用户相关的数据,并按名字、姓氏等排序再次取回它,然后使用名字/姓氏的第一个字母作为部分标题将其显示在表格视图中。 似乎加密正在干扰结果,因为当我尝试使用 lastName 作为排序描述符使用 NSFetchedResultsController 执行获取请求时,我什么也得不到。 我收到以下错误: CoreData: error: (NSFetchedResultsController) The fetched object at index X has an out of order section name 'S. Objects must be sorted by section name' 我花了很多时间调查这个问题,但无济于事。 有谁知道问题可能是什么以及如何解决它? 在转换器解密数据后,有没有办法对数据库进行排序? 或者有没有办法取回原始数据,然后在 NSFetchedResultsController 的实例中获得数据后对其进行排序? 我使用这个源来加密核心数据属性: 回答1 《核心数据编程指南》中有一些相关信息。 获取托管对象: 您不能使用基于瞬态属性的谓词来获取