Page 1 sur 2

Chiffrement de champs avec clefs publiques

MessagePublié: 02 Juin 2008 à 15:26
par Michaël TERRIEN
Bonjour à toutes et à tous,

Il y a quelques temps, sur une base utilisée depuis quelques années, on m'avait demandé de chiffrer certains champs des documents enregistrés avec un masque. Je me suis donc orienté vers l'utilisation du champ PublicEncryptionKeys que j'ai défini avec le propriétés suivantes :
- Type : Noms
- modifiable
- Choix via la boite de dialogue d'adresse
Les champs à chiffrer ont bien la propriété 'Options de sécurité' renseigner avec 'Autoriser le chiffrement de ce champ'.

A l'époque nous étions en Domino V6.5 et il me semble que cela a fonctionner.

Depuis nous sommes passés en V8.01 et cela ne fonctionne plus. A l'enregistrement d'un document, je vois bien dans ma barre de message défiler les textes "Encrypting document with x public keys" mais pourtant les champs ne sont pas chiffrés quand un utilisateur non autorisés les visualisent. Le document ne contient pas les champs $Seal ou $SealData.

J'ai fait différents tests :
- Mise en place du chiffrement sur un autre masque de la même base => cela fonctionne bien
- Mise en place du chiffrement sur un autre masque de la même base et qui contient aussi un champ de type 'Lecteur' => Cela ne fonctionne pas non plus.
- Mise en place du chiffrement sur un masque dans une autre base => cela fonctionne bien
- Mise en place du chiffrement sur un masque d'une autre base et qui contient aussi un champ de type 'Lecteur' => Cela ne fonctionne pas non plus.

Le pbm semble donc venir des documents avec un champ de type lecteur. Quelqu'un a-t-il connaissance des règles qui régissent la cohabitation de ces type de champ ? Mon analyse est-elle fausse ?

Merci de votre assistance.

MessagePublié: 03 Juin 2008 à 20:49
par Michaël TERRIEN
Je me sens seul pour le coup :((

MessagePublié: 04 Juin 2008 à 09:30
par Stephane Maillard
Salut,

Effectivement ton problème est complexe et pas beaucoup de document la dessus. Qu'est ce que tu as dans le champs lecteur ?

MessagePublié: 04 Juin 2008 à 15:56
par Michaël TERRIEN
Stephane Maillard a écrit:Salut,

Effectivement ton problème est complexe et pas beaucoup de document la dessus. Qu'est ce que tu as dans le champs lecteur ?


Une liste de chaine de texte :
- un groupe contenant des utilisateurs Notes parmi lesquels sont piochés les personnes renseignés danns le PublicEncryptionKeys
- "LocalDomainServers"
- "LocalDomainAdmins"
- le serveur de notre extranet d'un autre domaine sur laquelle est répliquée la base
- éventuellement un utilisateur d'un annuaire secondaire de l'autre domaine.

Ca ne doit pas simplifier le pbm...

MessagePublié: 27 Juin 2008 à 10:54
par Michaël TERRIEN
Cela n'aide donc pas à comprendre le pbm... :(

MessagePublié: 27 Juin 2008 à 12:39
par Jérome Deniau
D'abord vérifier si tous les intervenants ont bien une clé publique dans l'annuaire.

MessagePublié: 27 Juin 2008 à 16:28
par Michaël TERRIEN
Jérôme Deniau a écrit:D'abord vérifier si tous les intervenants ont bien une clé publique dans l'annuaire.


Merci Jérôme pour cette piste mais tout le monde a bien une clé publique dans l'annuaire.
Par ailleurs, comme je l'ai indiqué, j'ai fait le test en créant un document avec un autre masque de la même base et avec les mêmes intervenants et cela fonctionne correctement... à partir du moment où il n'y a pas de champ lecteur dans le document.

MessagePublié: 27 Juin 2008 à 16:53
par Jérome Deniau
Il faudrait voir le contenu du champ de type names et si les données (hors groupe) du champ lecteur est bien au format hiérarchique (CN=.......)

Les versions antérieures étaient plutôt permissives (notesviewEntries, etc....), la 8 nettement moins, donc il doti manquer quelque chose à mon avis....

MessagePublié: 27 Juin 2008 à 16:58
par Jérome Deniau
Comme je ne veux pas me développer un truc, si tu as 2 documents et ton masque je suis preneur.....

Re: Chiffrement de champs avec clefs publiques

MessagePublié: 16 Oct 2013 à 10:07
par pivo
Hello,

Il n'y a jamais eu de solution pour ceci ? Je fais face au même problème.

Et 0 documentation...

Re: Chiffrement de champs avec clefs publiques

MessagePublié: 16 Oct 2013 à 10:17
par Michael DELIQUE
Salut

quelle est le souci ?

Re: Chiffrement de champs avec clefs publiques

MessagePublié: 16 Oct 2013 à 10:39
par pivo
Le souci... ça avait l'air simple quand j'ai regardé comment c'était fait chez un client. J'ai relevé les noms des champs "PublicEncryptionKeys", etc qu'ils utilisaient dans leur base et tout ça.

Revenu à mon bureau je développe une autre base pour eux, je mets les mêmes champs cachés, je crypte les champ à crypter, ils apparaissent en rouge, je me dis que c'est bon...

Et bien non. Tous les champs sont visibles et lisibles par mon utilisateur de test.

Dans PublicEncryptionKeys j'ai mis un compute when composed à @Username pour débuter, il y a bien mon nom dedans. J'ai également essayer de doubler l'encryption en rajoutant un SecretEncryptionKeys avec une clé que j'ai créé pour ça (j'ai lu sur un forum qu'il fallait les 2 pour forcer l'encryption) : http://www-10.lotus.com/ldd/nd6forum.ns ... enDocument

J'en suis à me demander s'il ne faut pas un réglage serveur spécifique pour y arriver. Donc y a-t-il qq part une marche à suivre... à suivre ?

Re: Chiffrement de champs avec clefs publiques

MessagePublié: 16 Oct 2013 à 11:21
par Michael DELIQUE
re,

pour un utilisateurs ayant les droits, les champs n'apparaitrons pas comme crypté.
tu travail sur quel version ? moi je suis en 8.5 et j'ai pas de souci.

concernant "PublicEncryptionKeys" il faut rajouté cette clé dans l'id des utilisateurs devant lire l'information. ce qui veux dire qu'elle peut être perdu. il faut la stocker dans un endroit sur.

Re: Chiffrement de champs avec clefs publiques

MessagePublié: 16 Oct 2013 à 12:27
par pivo
Je suis en 8.5 et 9 pour mes tests. Designer utilisé sur la 8.5.

C'est pas le serveur ni les ID, une vieille base que j'ai retrouvé avec ce mécanisme fonctionne (mêmes users de test, même serveur)

J'ai même copié-collé le champ en question d'un masque à l'autre (et donc d'une base à l'autre). Comparé les documents créés (1 sur lequel le cryptage marche, 1 sur lequel non) champ par champ, y a pas d'autre valeur cachée.

J'ai jamais autant ramé... vais peut-être tenter la traversée du Pacifique en solitaire à la rame...

Re: Chiffrement de champs avec clefs publiques

MessagePublié: 16 Oct 2013 à 12:57
par Michael DELIQUE
je sais pas si ca va t'aider, mais voici deux fonction que j'utilise pour stocker les mots de passes. sur mes server en 8.5 ça fonctionne bien

Code : Tout sélectionner
Public Function PasswordVaultGet(wID As String, wDBVault As NotesDatabase) As Variant

   %REM
      pour fonctionner les agents utilisant cette fonction doivent avoir le sevurity level a 2
   %END REM   

     Dim DBVault As NotesDatabase
     Dim Doc As NotesDocument
     Dim vrValue As Variant
     Dim Item As NotesItem
     Dim lstPassword List As String
     Dim i As Integer
     Dim Tag As String

     On Error GoTo CatchError

     PasswordVaultGet = Null

     If Trim(wID) = "" Then
         Error 9999,"wID is Empty"
         Exit Function
     End If

     If Session Is Nothing Then
         Set Session  = New NotesSession
     End If

     If wDBVault Is Nothing Then
         Set DBVault = Session.Currentdatabase
     Else
         Set DBVault = wDBVault
     End If

     Set Doc = PasswordVaultDoc(UCase(Trim(wID)),DBVault)
     If Not Doc Is Nothing Then
         vrValue = Doc.Items
         If IsArray(vrValue) = True Then
             If IsEmpty(vrValue) = False Then
                 i=0
                 ForAll ValueItem In vrValue
                     Set Item = ValueItem
                     If Not Item Is Nothing Then
                         If UCase(Left(Trim(Item.Name),4)) = "PSW_" Then
                             i=i+1
                             Tag = StrRight(Trim(Item.Name),"PSW_")
                             lstPassword(Tag) = Item.Text
                         End If
                         Set Item = Nothing
                     End If
                 End ForAll
                 Select Case i
                 Case 0
                     PasswordVaultGet = Null
                 Case 1
                     PasswordVaultGet = lstPassword(Tag)
                 Case Else
                     PasswordVaultGet = lstPassword
             End Select
                 Erase lstPassword
             End If
         End If
         vrValue = Null
         Set Doc = Nothing
     End If

     Exit Function
CatchError:
     MsgBox "("+Structure_Log+" : "+Cstr(GetThreadInfo (1))+" Call by "+Cstr(GetThreadInfo(10))+")"+Chr(10)+"Error " + CStr(Err) + " : "+Chr(10) + CStr(Error)+". "+Chr(10)+"Line # "+Cstr(Erl),16," Error !"
     PasswordVaultGet = Null
     Exit Function
End Function

Public Function PasswordVaultSet(wvrParam As Variant, wvrPassword As Variant, wDBVault As NotesDatabase) As Boolean

   %REM enregistre les données des mots de passe, tous les parametres doivent être renseigné, pas d'update partielle
    le tag de la list des mots de passe est utilisé pour créé les champs qui stock les mots de passe
    pour fonctionner les agents utilisant cette fonction doivent avoir le sevurity level a 2
   %END REM
   
   Dim DBVault As NotesDatabase
   Dim Doc As NotesDocument
   Dim Item As NotesItem
   Dim vrValue As Variant
   Dim vrPublicKey As Variant
   Dim nmUser As NotesName
   Dim nbOK As Boolean
   Dim Tag As String
   Dim j As Integer

   Const Separator = ";"
   Const nbPublicEncryptionKeysMax = 100

   On Error GoTo CatchError

   PasswordVaultSet = False

   If IsList(wvrParam) = False Then
      Error 9999,"wvrParam is Not defined"
      Exit Function
   End If

   If IsList(wvrPassword) = False Then
      If DataType(wvrPassword) <> 8 Then
         Error 9999,"wvrPassword is Not defined"
         Exit Function
      End If
   End If

   nbOK = False
   ForAll ValuePSW In wvrPassword
      If Trim(CStr(ValuePSW)) <> "" Then
         nbOK = True
         Exit ForAll
      End If
   End ForAll

   If nbOK = False Then
      Error 9999,"wlstParam is Empty"
   End If

   If IsElement(wvrParam("ID")) = False Then
      Error 9999,"Tag 'ID' is not defined in wlstParam"
      Exit Function
   ElseIf Trim(wvrParam("ID")) = "" Then
      Error 9999,"Tag 'ID' is Empty in wlstParam"
      Exit Function
   End If

   nbOK = False
   If IsElement(wvrParam("PUBLICENCRYPTIONKEYS")) = True Then
      If Trim(wvrParam("PUBLICENCRYPTIONKEYS")) <> "" Then
         nbOK = True
         vrPublicKey = Split(wvrParam("PUBLICENCRYPTIONKEYS"),Separator)
      End If
   End If
   If nbOK = False Then
      If IsElement(wvrParam("SECRETENCRYPTIONKEYS")) = True Then
         If Trim(wvrParam("SECRETENCRYPTIONKEYS")) <> "" Then
            nbOK = True
         End If
      End If
   End If
   If nbOK = False Then
      Error 9999,"No PublicEncryptionKeys and SecretEncryptionKeys"
      Exit Function
   End If

   If Session Is Nothing Then
      Set Session  = New NotesSession
   End If

   If wDBVault Is Nothing Then
      Set DBVault = Session.Currentdatabase
   Else
      Set DBVault = wDBVault
   End If

   Set Doc = PasswordVaultDoc(UCase(Trim(wvrParam("ID"))),DBVault)

   If Doc Is Nothing Then
      Set Doc = DBVault.Createdocument()
      Call Doc.Replaceitemvalue("Form", "FRMPSWVAULT")
      Call Doc.Replaceitemvalue("ID", UCase(Trim(wvrParam("ID"))))
      Set Item = New NotesItem(Doc,"nmAuthorAdmin","[Admin]",AUTHORS)
      Set Item = Nothing
   Else
      Call Doc.Replaceitemvalue("PublicEncryptionKeys", "")
      Call Doc.Removeitem("PublicEncryptionKeys")
      Call Doc.Replaceitemvalue("SecretEncryptionKeys", "")
      Call Doc.Removeitem("SecretEncryptionKeys")
      Call Doc.Replaceitemvalue("nmAuthors", "")
      Call Doc.Removeitem("nmAuthors")
      Call Doc.Replaceitemvalue("nmReaders", "")
      Call Doc.Removeitem("nmReaders")

      vrValue = Doc.Items
      If IsArray(vrValue) = True Then
         If IsEmpty(vrValue) = False Then
            ForAll ValueItem In vrValue
               Set Item = ValueItem
               If Not Item Is Nothing Then
                  If UCase(Left(Trim(Item.Name),4)) = "PSW_" Then
                     Item.Values = Null
                     Call Item.Remove()
                  End If
                  Set Item = Nothing
               End If
            End ForAll
         End If
      End If
      vrValue = Null
   End If

   If IsElement(wvrParam("SECRETENCRYPTIONKEYS")) = True Then
      If Trim(wvrParam("SECRETENCRYPTIONKEYS")) <> "" Then
         Call Doc.Replaceitemvalue("SecretEncryptionKeys",Trim(wvrParam("SECRETENCRYPTIONKEYS")))         
      End If
   End If
   j=0
   If IsArray(vrPublicKey) = True Then
      If IsEmpty(vrPublicKey) = False Then
         Set Item = Doc.Getfirstitem("PublicEncryptionKeys")
         If Item Is Nothing Then
            Set Item = New NotesItem(Doc,"PublicEncryptionKeys","",NAMES)
         Else
            Item.values = Null
         End If
         Item.Isencrypted = False
         ForAll Value In vrPublicKey
            If Trim(CStr(Value)) <> "" Then
               Set nmUser = New NotesName(Trim(CStr(Value)))
               If Item.Contains(nmUser.Canonical) = False Then
                  j=j+1
                  Call Item.Appendtotextlist(nmUser.Canonical)
               End If
               Set nmUser = Nothing
            End If
         End ForAll
      End If
   End If
   Set nmUser = New NotesName(Session.Username)
   If Item.Contains(nmUser.Canonical) = False Then
      Call Item.Appendtotextlist(nmUser.Canonical)
      j=j+1
   End If
   Set nmUser = New NotesName(Session.Effectiveusername)
   If Item.Contains(nmUser.Canonical) = False Then
      Call Item.Appendtotextlist(nmUser.Canonical)
      j=j+1
   End If
   Set nmUser = Nothing
   Set Item = Nothing
   
   If j > nbPublicEncryptionKeysMax Then
      Set Doc = Nothing
      Error 9999,"Too much PublicEncryptionKeys ("+CStr(j)+") maximum allowed : "+CStr(nbPublicEncryptionKeysMax)+". You risk : 'Notes error: Adding entry will cause text list to exceed 64K. Entry not added.'"      
      Exit Function
   %REM
         s'il ya trop de personne dans le champ 'PublicEncryptionKeys' même si le champ ne dépasse pas la taille autorisé.
         lors de l'encryptage le champs va "contenir" les clés des utilisateurs et dépassé les 64k.
         après test il semble que 100 membres maximum soit une limite acceptable
   %END REM
   End If

   Set Item = Doc.Getfirstitem("nmAuthors")
   If Item Is Nothing Then
      Set Item = New NotesItem(Doc,"nmAuthors","",AUTHORS)
   Else
      Item.values = Null
   End If
   Item.Isencrypted = False
   If IsElement(wvrParam("AUTHORS")) = True Then
      If Trim(wvrParam("AUTHORS"))<> "" Then
         vrValue = Split(wvrParam("AUTHORS"),Separator)
         If IsArray(vrValue) = True Then
            If IsEmpty(vrValue) = False Then
               ForAll Value In vrValue
                  If Trim(CStr(Value)) <> "" Then
                     Set nmUser = New NotesName(Trim(CStr(Value)))
                     If Item.Contains(nmUser.Canonical) = False Then
                        Call Item.Appendtotextlist(nmUser.Canonical)
                     End If
                     Set nmUser = Nothing
                  End If
               End ForAll
            End If
         End If
         vrValue = Null
      End If
   End If
   Set nmUser = New NotesName(Session.Username)
   If Item.Contains(nmUser.Canonical) = False Then
      Call Item.Appendtotextlist(nmUser.Canonical)
   End If
   Set nmUser = New NotesName(Session.Effectiveusername)
   If Item.Contains(nmUser.Canonical) = False Then
      Call Item.Appendtotextlist(nmUser.Canonical)
   End If
   Set nmUser = Nothing

   If IsArray(vrPublicKey) = True Then
      If IsEmpty(vrPublicKey) = False Then
         ForAll Value In vrPublicKey
            If Trim(CStr(Value)) <> "" Then
               Set nmUser = New NotesName(Trim(CStr(Value)))
               If Item.Contains(nmUser.Canonical) = False Then
                  Call Item.Appendtotextlist(nmUser.Canonical)
               End If
               Set nmUser = Nothing
            End If
         End ForAll
      End If
   End If
   Set Item = Nothing

   Set Item = Doc.Getfirstitem("nmReaders")
   If Item Is Nothing Then
      Set Item = New NotesItem(Doc,"nmReaders","",READERS)
   Else
      Item.values = Null
   End If
   Item.Isencrypted = False
   If IsElement(wvrParam("READERS")) = True Then
      If Trim(wvrParam("READERS"))<> "" Then
         vrValue = Split(wvrParam("READERS"),Separator)
         If IsArray(vrValue) = True Then
            If IsEmpty(vrValue) = False Then
               ForAll Value In vrValue
                  If Trim(CStr(Value)) <> "" Then
                     Set nmUser = New NotesName(Trim(CStr(Value)))
                     If Item.Contains(nmUser.Canonical) = False Then
                        Call Item.Appendtotextlist(nmUser.Canonical)
                     End If
                     Set nmUser = Nothing
                  End If
               End ForAll
            End If
         End If
         vrValue = Null
      End If
   End If
   Set nmUser = New NotesName(Session.Username)
   If Item.Contains(nmUser.Canonical) = False Then
      Call Item.Appendtotextlist(nmUser.Canonical)
   End If
   Set nmUser = New NotesName(Session.Effectiveusername)
   If Item.Contains(nmUser.Canonical) = False Then
      Call Item.Appendtotextlist(nmUser.Canonical)
   End If
   Set nmUser = Nothing

   If IsArray(vrPublicKey) = True Then
      If IsEmpty(vrPublicKey) = False Then
         ForAll Value In vrPublicKey
            If Trim(CStr(Value)) <> "" Then
               Set nmUser = New NotesName(Trim(CStr(Value)))
               If Item.Contains(nmUser.Canonical) = False Then
                  Call Item.Appendtotextlist(nmUser.Canonical)
               End If
               Set nmUser = Nothing
            End If
         End ForAll
      End If
   End If
   Set Item = Nothing
   vrPublicKey = Null

   If DataType(wvrPassword) = 8 Then
      Tag = "PSW_"+UCase(Trim(wvrPassword("ID")))
      Set Item = New NotesItem(Doc, Tag,CStr(wvrPassword))
      Item.Isencrypted = True
      Set Item = Nothing
      Tag = ""
   Else
      ForAll i In wvrPassword
         Tag = Trim(CStr(ListTag(i)))
         If Tag <> "" Then
            If Trim(wvrPassword(Tag)) <> "" Then               
               Set Item = New NotesItem(Doc, "PSW_"+UCase(Trim(CStr(Tag))),wvrPassword(Tag))
               Item.Isencrypted = True
               Set Item = Nothing
            End If
         End If
         Tag = ""
      End ForAll
   End If

   Call Doc.Encrypt()   
   Call Doc.Save(True,False)
   Set Doc = Nothing
   Set DBVault = Nothing

   PasswordVaultSet = True
   
   %REM
         lstParam("PUBLICENCRYPTIONKEYS") = ""
         lstParam("SECRETENCRYPTIONKEYS") = ""
         lstParam("ID") = ""
         lstParam("AUTHORS") = ""
         lstParam("READERS") = ""

         lstPassword(Login / identifant du mot de passe)
   %END REM

   Exit Function
CatchError:
   MsgBox "("+Structure_Log+" : "+Cstr(GetThreadInfo (1))+" Call by "+Cstr(GetThreadInfo(10))+")"+Chr(10)+"Error " + CStr(Err) + " : "+Chr(10) + CStr(Error)+". "+Chr(10)+"Line # "+Cstr(Erl),16," Error !"
   PasswordVaultSet = False
   Exit Function
End Function