Tipo di base Password
Il tipo di base PASSWORD è ora un valore basato su keystore crittografato.
Modifiche in ThingWorx 8.2
In ThingWorx 8.2 la protezione del tipo di base PASSWORD è stata migliorata. Il tipo di base PASSWORD è stato modificato in un valore basato su keystore crittografato. Questa modifica potrebbe avere implicazioni durante l'importazione e l'esportazione di password. Di seguito sono descritte le best practice.
* 
Alcuni agenti edge non sono compatibili con il nuovo tipo di base PASSWORD a causa del nuovo e più robusto modello di protezione.
C SDK, .NET SDK, EMS e iOS SDK non erano in grado di accedere alle password prima di questa modifica e mantengono tale comportamento.
Prima di ThingWorx 8.2, l'SDK Java e l'SDK Android avevano la capacità di ricevere le password e le librerie incluse per decrittografare le password una volta che i valori crittografati raggiungevano l'edge. Con questa modifica, i valori crittografati non possono essere ricevuti né decrittografati. Se un valore del tipo di base Password viene inviato all'edge, viene generato un errore negli SDK Java e Android quando l'edge prova a decrittografare la password.
Errore JSDK prima della versione 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
Errore 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
* 
Il tipo di base PASSWORD non deve essere utilizzato come chiave principale su una tabella dati.
Best practice quando si aggiungono password a stream e tabelle di dati
Quando si aggiungono voci a una tabella o a uno stream di dati utilizzando i servizi AddEntry (ad esempio AddIntegerStreamEntry) tramite Composer o l'API REST, le password devono essere crittografate utilizzando EncryptionServices.encryptPropertyValue. Ad esempio,
// 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
};
Best practice per l'importazione e l'esportazione di password
Quando si importano ed esportano password, utilizzare il sistema di esportazione di default e assicurarsi che lo stesso keystore sia installato sul sistema che esegue l'importazione.
Se è richiesta un'esportazione di password in testo semplice (consigliata solo per la rotazione delle chiavi), l'esportazione deve essere eseguita tramite l'API REST e deve essere trattata come informazione sensibile.
* 
Attenzione: durante l'esportazione di password in testo semplice, assicurarsi che il file sia protetto in modo appropriato. Le esportazioni di testo semplice non contengono protezione integrata.
Esempio di una chiamata API REST contenente una password in testo semplice:
GET /Thingworx/Exporter/Users/test HTTP/1.1
Host: localhost:8080
Accept: text/xml
Content-Type: application/json
universal: password
Authorization: Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
* 
Non esportare le password come chiavi principali nelle tabelle dati.
* 
Se si perde la chiave di crittografia (keystore), tutti i dati crittografati andranno persi.
Best practice per la rotazione delle chiavi delle password
Per le best practice per la rotazione delle chiavi, fare riferimento a http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf
Best practice per le password in uno scenario federato
Quando si pubblicano o si sottoscrivono password in uno scenario federato, la crittografia e la decrittografia hanno esito positivo solo se si utilizza la stessa chiave di crittografia della password. Se le chiavi sono diverse, la decrittografia non avrà esito positivo sul server federato e la proprietà non verrà letta. Se si tenta di utilizzare la stessa chiave di crittografia, verrà registrato un errore.