Tipo base Password
El tipo base PASSWORD es ahora un valor cifrado basado en keystore.
Cambios en ThingWorx 8.2
En ThingWorx 8.2, se ha mejorado la seguridad del tipo base PASSWORD. El tipo base PASSWORD se ha cambiado a un valor cifrado basado en keystore. Este cambio puede tener repercusiones al importar y exportar contraseñas. A continuación, se describen las prácticas recomendadas.
* 
Algunos agentes Edge no son compatibles con el nuevo tipo base PASSWORD debido al modelo de seguridad más potente.
Los SDK de C, .NET, EMS e iOS no podían acceder a las contraseñas antes de este cambio y siguen conservando este comportamiento.
Con anterioridad a ThingWorx 8.2, los SDK de Java y Android tenían la capacidad para recibir contraseñas e incluían bibliotecas para descifrar las contraseñas cuando los valores cifrados llegaban a la periferia. Con este cambio, los valores cifrados no se pueden recibir ni descifrar. Si un valor de tipo base Password se envía al servidor Edge, se activa un error en los SDK de Android y Java cuando el servidor Edge intenta descifrar la contraseña.
Error de versiones anteriores a 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
Error de JSDK 6.1 y versiones posteriores:
[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
* 
El tipo base PASSWORD no se debe utilizar como clave principal en una tabla de datos.
Prácticas recomendadas al añadir contraseñas a tablas y flujos de datos
Al añadir entradas a una tabla o flujo de datos mediante los servicios AddEntry (por ejemplo, AddIntegerStreamEntry) a través de Composer o la API de REST, se deben cifrar las contraseñas con EncryptionServices.encryptPropertyValue. Por ejemplo,
// 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
};
Prácticas recomendadas para la importación y exportación de contraseñas
Al importar y exportar contraseñas, utilice el sistema de exportación por defecto y asegúrese de que esté instalado el mismo keystore en el sistema que realiza la importación.
Si se requiere una exportación de texto sin formato de contraseñas (se recomienda para la rotación de claves solo), la exportación se debe realizar a través de la API de REST y se debe tratar como información confidencial.
* 
Atención: al exportar contraseñas de texto sin formato, asegúrese de que el fichero se guarde de forma adecuada. Las exportaciones de texto sin formato no contienen seguridad integrada.
Ejemplo de llamada de API de REST que contiene una contraseña de texto sin formato:
GET /Thingworx/Exporter/Users/test HTTP/1.1
Host: localhost:8080
Accept: text/xml
Content-Type: application/json
universal: password
Authorization: Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
* 
No exporte contraseñas como claves principales en tablas de datos.
* 
Si se pierde la clave de cifrado (keystore), se perderán los datos cifrados.
Prácticas recomendadas para la rotación de claves de contraseña
Para conocer las prácticas recomendadas para la rotación de claves, consulte http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf.
Prácticas recomendadas para contraseñas en un escenario federado
Al publicar o suscribirse a contraseñas en un escenario federado, la codificación y descodificación solo se realizan correctamente si se utiliza la misma clave de cifrado de contraseñas. Si las claves son diferentes, la descodificación no se realizará correctamente en el servidor federado ni tampoco se leerá la propiedad. Se registrará un error si se intenta utilizar la misma clave de cifrado.