Точный метод генерации идентификаторов SAML явно не определен - он должен просто соответствовать стандартам идентификатора XML. XML-идентификатором является xsd: NCName, который получен из xsd: Name, который не может начинаться с числа или содержать пробелы и должен иметь 160 битов «случайности».
Простейший генератор идентификаторов в Java, который удовлетворяет этим критериям:
String id() {
return "a" + UUID.randomUUID();
}
Кроме того, OpenSAML также поставляется с SecureRandomIdentifierGenerator:
// You will need to catch the NoSuchAlgorithmException during construction.
IdentifierGenerator idGenerator = new SecureRandomIdentifierGenerator();
String id() {
return idGenerator.generateIdentifier();
}
Фактический код генерации выглядит так:
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
String generateIdentifier() {
return generateIdentifier(16);
}
String generateIdentifier(int size) {
byte[] buf = new byte[size];
random.nextBytes(buf);
return "_".concat(new String(Hex.encode(buf)));
}
Еще одна альтернатива, извлеченная из SAMLSSOUtil :
char[] charMapping = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p' };
Random random = new Random();
String createID() {
byte[] bytes = new byte[20]; // 160 bits
random.nextBytes(bytes);
char[] chars = new char[40];
for (int i = 0; i < bytes.length; i++) {
int left = (bytes[i] >> 4) & 0x0f;
int right = bytes[i] & 0x0f;
chars[i * 2] = charMapping[left];
chars[i * 2 + 1] = charMapping[right];
}
return String.valueOf(chars);
}
Из Оазиса документов:
Простой тип xs: ID используется для объявления идентификаторов SAML для утверждений, запросов и ответов. Значения, объявленные как имеющие тип xs: ID в этой спецификации, ДОЛЖНЫ удовлетворять следующим свойствам в дополнение к свойствам, налагаемым определением самого типа xs: ID:
• Любая сторона, которая назначает идентификатор, ДОЛЖНА гарантировать, что существует незначительная вероятность того, что эта сторона или любая другая сторона случайно назначит один и тот же идентификатор другому объекту данных.
• Если объект данных объявляет, что у него есть определенный идентификатор, ДОЛЖНА быть точно одна такая декларация.
Механизм, с помощью которого системный объект SAML обеспечивает уникальность идентификатора, оставлен для реализации. В случае, когда используется случайный или псевдослучайный метод, вероятность того, что два случайно выбранных идентификатора будут идентичными, ДОЛЖНА быть меньше или равна 2 ^ -128 и ДОЛЖНА быть меньше или равна 2 ^ -160. Это требование МОЖЕТ быть удовлетворено путем кодирования произвольно выбранного значения длиной от 128 до 160 бит. Кодировка должна соответствовать правилам, определяющим тип данных xs: ID. НЕОБХОДИМО, чтобы генератор псевдослучайных чисел был засеян уникальным материалом, чтобы обеспечить требуемые уникальные свойства между различными системами.
Простой тип xs: NCName используется в SAML для ссылки на идентификаторы типа xs: ID, поскольку xs: IDREF не может использоваться для этой цели. В SAML элемент, на который ссылается ссылка на идентификатор SAML, может фактически быть определен в документе, отдельном от того, в котором используется ссылка на идентификатор. Использование xs: IDREF нарушило бы требование, чтобы его значение совпадало со значением атрибута ID для некоторого элемента в том же документе XML.