密码基本类型
PASSWORD 基本类型为基于密钥库的加密值。
ThingWorx 8.2 中的更改
在 ThingWorx 8.2 中,已对 PASSWORD 基本类型的安全性进行了改进。PASSWORD 基本类型已更改为基于密钥库的加密值。在导入和导出密码时,此更改可能会有影响。以下介绍了最佳做法。
* 
由于采用了更强大的安全模型,一些 Edge 代理与新的 PASSWORD 基本类型不兼容。
C SDK、.NET SDK、EMS 和 iOS SDK 在进行此更改之前无法访问密码,并且之后也仍无法访问。
在 ThingWorx 8.2 之前的版本中,Java SDK 和 Android SDK 具有接收密码的功能,并且包含在加密值到达 Edge 时用于解密密码的库。基于此项更改,加密值将无法接收和解密。如果将 PASSWORD 基本类型值发送到 Edge,当 Edge 尝试解密密码时,会在 Java 和 Android SDK 中触发错误。
JSDK 6.1 之前版本的错误:
[O: c.t.t.d.u.ValueCollectionSerializer] [T: main] Error reading value collection data: Unable to read primitive value from stream : Decrypt ERROR: null JSDK
JSDK 6.1+ 的错误:
[L: ERROR] [O: c.t.t.d.u.ValueCollectionSerializer] [T: main] Error reading value collection data: Unable to read primitive value from stream : java.lang.IllegalArgumentException: No key store file path specified
* 
PASSWORD 基本类型在数据表上不应用作主键。
将密码添加到数据表和流时的最佳做法
通过 Composer 或 REST API 使用 AddEntry 服务 (例如,AddIntegerStreamEntry) 将条目添加到数据表或流中时,必须使用 EncryptionServices.encryptPropertyValue 对密码进行加密。例如,
// test password value
var test_password = "test_123"
// values:INFOTABLE(Datashape: test_shape)
var values = Things["test_table"].CreateValues();

var params = {
data: test_password /* STRING */
};
values.p1 = Resources["EncryptionServices"].EncryptPropertyValue(params);
values.s1 = "test_string"; //STRING [Primary Key]

var params = {
source : me.name,
values : values
};
导入和导出密码的最佳做法
导入和导出密码时,请使用默认的导出系统,并确保在执行导入的系统上安装相同的 keystore。
如果需要导出纯文本密码 (建议仅用于密钥轮转),则必须通过 REST API 完成导出,并应将这些纯文本密码视为敏感信息。
* 
警告:导出纯文本密码时,请确保以适当的方式保护该文件。导出的纯文本不具有内置安全性。
包含纯文本密码的 REST API 调用的示例:
GET /Thingworx/Exporter/Users/test HTTP/1.1
Host: localhost:8080
Accept: text/xml
Content-Type: application/json
universal: password
Authorization: Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
* 
请勿在数据表中将密码导出为主键。
* 
如果您丢失了加密密钥 (密钥库),则所有加密数据均会丢失。
密码密钥轮转的最佳做法
联合情景中密码的最佳做法
在联合情景中发布或订阅密码时,只有在使用相同的密码加密密钥时,加密和解密才会成功。如果密钥不同,则在联合服务器上解密不会成功,并且不会读取属性。如果您尝试使用相同的加密密钥,则会记录一条错误。